kitchen-lxd_sling 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +3 -0
- data/.kitchen.yml +4 -6
- data/Berksfile +3 -3
- data/Gemfile +1 -1
- data/Rakefile +4 -4
- data/bin/console +3 -3
- data/bin/lxc-shell +8 -8
- data/kitchen-lxd_sling.gemspec +20 -20
- data/lib/kitchen/driver/lxd.rb +45 -43
- data/lib/kitchen/driver/lxd/host_locator.rb +4 -4
- data/lib/kitchen/driver/lxd_version.rb +1 -1
- data/lib/kitchen/transport/lxd.rb +8 -8
- data/lib/kitchen/verifier/inspec-lxd.rb +4 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3abb096dba2a0096045fbc2f24a8030fb1fa49670c9f9a6b8e916dbe9df1d945
|
4
|
+
data.tar.gz: 43142550d61d9bce30bdfa2310f4490728729044e35b88af552b3176e0b72469
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e30da85043672b192e5c5d5c2f948f130cb4a18db835d906b6331ba81e7ba8d6fa57bf3666a5a650db6242ec030d260a87d9904ffeb6d796c2794bf87455015
|
7
|
+
data.tar.gz: 2c760c7997d10b71ec7cdf548bef93c05516cce6310dff8024ce682c8d8eb5b33abe06f788fa379f7f4e91c8201cd3e326900df18e9eeff3ab5ff78c4f2a5615
|
data/.gitattributes
ADDED
data/.kitchen.yml
CHANGED
@@ -6,17 +6,15 @@ provisioner:
|
|
6
6
|
name: chef_zero
|
7
7
|
|
8
8
|
platforms:
|
9
|
-
- name: ubuntu-
|
10
|
-
verifier: inspec
|
9
|
+
- name: ubuntu-18.04
|
11
10
|
|
12
|
-
transport: lxd
|
13
|
-
|
14
11
|
suites:
|
15
12
|
- name: kitchen-lxd-native
|
13
|
+
verifier: inspec
|
16
14
|
provisioner:
|
17
15
|
downloads:
|
18
16
|
'/tmp/kitchen': <%= Dir.tmpdir %>/kitchen-download-test
|
19
17
|
- name: kitchen-lxd-cloud
|
20
18
|
driver:
|
21
|
-
image_server: https://cloud-images.ubuntu.com/
|
22
|
-
|
19
|
+
image_server: https://cloud-images.ubuntu.com/daily
|
20
|
+
ssh_login: ubuntu
|
data/Berksfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
source
|
1
|
+
source "https://supermarket.chef.io"
|
2
2
|
|
3
|
-
cookbook
|
3
|
+
cookbook "lxd_sling", git: "https://github.com/nexussw/lxd_sling.git"
|
4
4
|
|
5
5
|
group :test do
|
6
|
-
cookbook
|
6
|
+
cookbook "test", path: "test/cookbooks/test"
|
7
7
|
end
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
3
|
|
4
4
|
RSpec::Core::RakeTask.new(:spec)
|
5
5
|
|
6
6
|
task default: :spec
|
7
7
|
|
8
8
|
begin
|
9
|
-
require
|
9
|
+
require "kitchen/rake_tasks"
|
10
10
|
Kitchen::RakeTasks.new
|
11
11
|
rescue LoadError
|
12
|
-
puts
|
12
|
+
puts ">>>>> Kitchen gem not loaded, omitting tasks" unless ENV["CI"]
|
13
13
|
end
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "bundler/setup"
|
4
|
+
require "kitchen/lxd_sling"
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require 'kitchen/lxd_sling'
|
|
10
10
|
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require "irb"
|
14
14
|
IRB.start(__FILE__)
|
data/bin/lxc-shell
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
3
|
+
require "yaml"
|
4
4
|
|
5
5
|
def symbolize_keys(hash)
|
6
6
|
{}.tap do |retval|
|
@@ -12,12 +12,12 @@ end
|
|
12
12
|
|
13
13
|
state = symbolize_keys(YAML.load(File.read(ARGV[0])))
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
15
|
+
require "kitchen"
|
16
|
+
require "kitchen/driver/lxd/host_locator"
|
17
|
+
require "tty/reader"
|
18
|
+
require "tty/screen"
|
19
|
+
require "io/wait"
|
20
|
+
require "io/console"
|
21
21
|
|
22
22
|
class NxHost
|
23
23
|
include Kitchen::Driver::Lxd::HostLocator
|
@@ -38,7 +38,7 @@ end
|
|
38
38
|
|
39
39
|
# ruby bin/lxc-shell .kitchen/kitchen-lxd-native-ubuntu-1604.yml
|
40
40
|
|
41
|
-
term = ENV[
|
41
|
+
term = ENV["TERM"] || "dumb"
|
42
42
|
user = transport.username
|
43
43
|
if user
|
44
44
|
user = " - #{user}"
|
data/kitchen-lxd_sling.gemspec
CHANGED
@@ -1,34 +1,34 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "kitchen/driver/lxd_version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = "kitchen-lxd_sling"
|
8
8
|
spec.version = Kitchen::Driver::LXD_VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ["Sean Zachariasen"]
|
10
|
+
spec.email = ["thewyzard@hotmail.com"]
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
12
|
+
spec.summary = "Test Kitchen Driver for LXD"
|
13
|
+
spec.homepage = "https://github.com/NexusSW/kitchen-lxd_sling"
|
14
|
+
spec.license = "Apache-2.0"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
17
|
f.match(%r{^(test|spec|features)/})
|
18
18
|
end
|
19
|
-
spec.bindir =
|
19
|
+
spec.bindir = "exe"
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_dependency
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
23
|
+
spec.add_dependency "lxd-common", "~> 0.9"
|
24
|
+
spec.add_dependency "test-kitchen", "~> 1.0"
|
25
|
+
spec.add_dependency "tty-reader", "~> 0.2"
|
26
|
+
spec.add_dependency "tty-screen", "~> 0.6"
|
27
27
|
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "rake"
|
30
|
+
spec.add_development_dependency "rspec"
|
31
|
+
spec.add_development_dependency "berkshelf"
|
32
|
+
spec.add_development_dependency "kitchen-inspec"
|
33
|
+
spec.add_development_dependency "train-lxd"
|
34
34
|
end
|
data/lib/kitchen/driver/lxd.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "kitchen"
|
2
|
+
require "kitchen/driver/base"
|
3
|
+
require "kitchen/transport/lxd"
|
4
|
+
require "kitchen/driver/lxd_version"
|
5
|
+
require "kitchen/driver/lxd/host_locator"
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
7
|
+
require "nexussw/lxd/driver/cli"
|
8
|
+
require "nexussw/lxd/driver/rest"
|
9
|
+
require "nexussw/lxd/transport/cli"
|
10
|
+
require "nexussw/lxd/transport/rest"
|
11
|
+
require "nexussw/lxd/transport/local"
|
12
12
|
|
13
|
-
require
|
13
|
+
require "securerandom"
|
14
14
|
|
15
|
-
require
|
15
|
+
require "kitchen/verifier/inspec-lxd"
|
16
16
|
|
17
17
|
module Kitchen
|
18
18
|
module Driver
|
@@ -29,12 +29,12 @@ module Kitchen
|
|
29
29
|
|
30
30
|
default_config :server, nil
|
31
31
|
default_config :port, 8443
|
32
|
-
default_config :image_server,
|
32
|
+
default_config :image_server, "https://images.linuxcontainers.org"
|
33
33
|
default_config :rest_options, {}
|
34
34
|
|
35
35
|
def create(state)
|
36
36
|
state[:config] = config.select { |k, _| [:server, :port, :rest_options, :image_server].include? k }
|
37
|
-
info
|
37
|
+
info "Utilizing REST interface at " + host_address if respond_to?(:info) && can_rest?
|
38
38
|
|
39
39
|
state[:username] = config[:username] if config.key? :username
|
40
40
|
state[:container_name] = new_container_name unless state[:container_name]
|
@@ -45,16 +45,12 @@ module Kitchen
|
|
45
45
|
info "Container name: #{state[:container_name]}"
|
46
46
|
driver.create_container(state[:container_name], state[:container_options])
|
47
47
|
|
48
|
-
if state[:username] && cloud_image?
|
49
|
-
info 'Waiting for cloud-init...'
|
50
|
-
driver.wait_for state[:container_name], :cloud_init
|
51
|
-
end
|
52
48
|
# Allow SSH transport on known images with sshd enabled
|
53
49
|
# This will only work if the container is routable. LXD does not do port forwarding (yet)
|
54
50
|
# Which also means that you might need to do 'ssh_login: false' in the config if you're using a cloud-image and aren't routable
|
55
51
|
# think ahead for default behaviour once LXD can port forward
|
56
52
|
# FUTURE: If I get time I'll look into faking a port forward with something under /dev/ until then
|
57
|
-
info
|
53
|
+
info "Waiting for an IP address..."
|
58
54
|
state[:ip_address] = state[:hostname] = container_ip(state)
|
59
55
|
if use_ssh?
|
60
56
|
# Normalize [:ssh_login]
|
@@ -62,7 +58,13 @@ module Kitchen
|
|
62
58
|
config[:ssh_login] ||= {} # if config[:ssh_login] && !config.to_hash[:ssh_login].is_a?(Hash)
|
63
59
|
|
64
60
|
state[:username] = config[:ssh_login][:username] if config[:ssh_login].key? :username
|
65
|
-
state[:username] ||=
|
61
|
+
state[:username] ||= "root"
|
62
|
+
|
63
|
+
if (state[:username] != "root") && cloud_image?
|
64
|
+
info "Waiting for cloud-init..."
|
65
|
+
driver.wait_for state[:container_name], :cloud_init
|
66
|
+
end
|
67
|
+
|
66
68
|
setup_ssh(state[:username], config[:ssh_login][:public_key] || "#{ENV['HOME']}/.ssh/id_rsa.pub", state)
|
67
69
|
info "SSH access enabled on #{state[:ip_address]}"
|
68
70
|
else
|
@@ -75,9 +77,9 @@ module Kitchen
|
|
75
77
|
# only centos/7 and various ubuntu versions have been tested here
|
76
78
|
# - ubuntu non-cloud has no download utilities in order to dl the chef package so we must adapt that
|
77
79
|
# - centos/7 needs sudo installed, or you need to use sudo:false on the provisioner... leaving it explicit for the user to fix
|
78
|
-
unless transport.execute(
|
79
|
-
info
|
80
|
-
transport.execute(
|
80
|
+
unless transport.execute("test -d /etc/apt").error?
|
81
|
+
info "Installing additional dependencies..."
|
82
|
+
transport.execute("apt-get install openssl curl ca-certificates -y").error!
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
@@ -115,11 +117,11 @@ module Kitchen
|
|
115
117
|
def cloud_image?
|
116
118
|
server = image_server
|
117
119
|
return false unless server && server[:server]
|
118
|
-
server[:server].downcase.start_with?
|
120
|
+
server[:server].downcase.start_with? "https://cloud-images.ubuntu.com"
|
119
121
|
end
|
120
122
|
|
121
123
|
def new_container_name
|
122
|
-
instance.name +
|
124
|
+
instance.name + "-" + SecureRandom.hex(8)
|
123
125
|
end
|
124
126
|
|
125
127
|
# Normalize into a hash with the correct protocol
|
@@ -132,7 +134,7 @@ module Kitchen
|
|
132
134
|
server = config[:image_server]
|
133
135
|
if server.is_a? String
|
134
136
|
server = { server: server }
|
135
|
-
server[:protocol] =
|
137
|
+
server[:protocol] = "simplestreams" if server[:server].split(":", 3)[2].nil?
|
136
138
|
end
|
137
139
|
server
|
138
140
|
end
|
@@ -149,19 +151,19 @@ module Kitchen
|
|
149
151
|
return name unless server
|
150
152
|
|
151
153
|
# 1:
|
152
|
-
if server.downcase.start_with?
|
154
|
+
if server.downcase.start_with? "https://cloud-images.ubuntu.com"
|
153
155
|
info "Using cloud-image '#{name}'"
|
154
|
-
return name.downcase.sub(/^ubuntu-/,
|
156
|
+
return name.downcase.sub(/^ubuntu-/, "")
|
155
157
|
end
|
156
158
|
# 2:
|
157
|
-
if server.downcase.start_with?
|
158
|
-
name = name.downcase.split(
|
159
|
+
if server.downcase.start_with? "https://images.linuxcontainers.org"
|
160
|
+
name = name.downcase.split("-")
|
159
161
|
# 'core' parses out in this method as the 'version' so just use 'ubuntu-core' in the kitchen.yml
|
160
|
-
if UBUNTU_RELEASES.key?(name[1]) && name[0] ==
|
162
|
+
if UBUNTU_RELEASES.key?(name[1]) && name[0] == "ubuntu"
|
161
163
|
name[1] = UBUNTU_RELEASES[name[1]]
|
162
|
-
name[0] =
|
164
|
+
name[0] = "ubuntu-core" if name[1] == "16" # Logic patch for the edge case. We'll do something different if this gets complicated
|
163
165
|
end
|
164
|
-
name = name.join(
|
166
|
+
name = name.join("/")
|
165
167
|
info "Using standard image #{name}"
|
166
168
|
end
|
167
169
|
name
|
@@ -171,20 +173,20 @@ module Kitchen
|
|
171
173
|
# leaving this mutable so that end-users can append new releases to it
|
172
174
|
# Usage Note: If a future release is not in the below table, just specify the full image name in the kitchen yml instead of using ubuntu-<version>
|
173
175
|
UBUNTU_RELEASES = { # rubocop:disable Style/MutableConstant
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
176
|
+
"12.04" => "precise",
|
177
|
+
"14.04" => "trusty",
|
178
|
+
"16.04" => "xenial",
|
179
|
+
"17.04" => "zesty",
|
180
|
+
"17.10" => "artful",
|
181
|
+
"18.04" => "bionic",
|
182
|
+
"core" => "16",
|
181
183
|
}
|
182
184
|
|
183
185
|
def container_options
|
184
186
|
options = image_server
|
185
187
|
# 0:
|
186
188
|
found = false
|
187
|
-
%w
|
189
|
+
%w{:alias :fingerprint :properties}.each do |k|
|
188
190
|
if config.key? k
|
189
191
|
options[k] = config[k]
|
190
192
|
found = true
|
@@ -213,9 +215,9 @@ module Kitchen
|
|
213
215
|
raise
|
214
216
|
ensure
|
215
217
|
raise ActionFailed, "User (#{username}), or their home directory, were not found within container (#{state[:container_name]})" unless sshdir && !sshdir.empty?
|
216
|
-
sshdir +=
|
218
|
+
sshdir += "/.ssh"
|
217
219
|
end
|
218
|
-
ak_file = sshdir +
|
220
|
+
ak_file = sshdir + "/authorized_keys"
|
219
221
|
|
220
222
|
info "Inserting public key for container user '#{username}'"
|
221
223
|
transport.execute("bash -c 'mkdir -p #{sshdir} 2> /dev/null; cat #{remote_file} >> #{ak_file} \
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "kitchen/driver/base"
|
2
|
+
require "nexussw/lxd/transport/local"
|
3
|
+
require "nexussw/lxd/driver/cli"
|
4
|
+
require "nexussw/lxd/driver/rest"
|
5
5
|
|
6
6
|
class Kitchen::Driver::Lxd < Kitchen::Driver::Base
|
7
7
|
module HostLocator
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "kitchen/transport/base"
|
2
|
+
require "kitchen/driver/lxd_version"
|
3
|
+
require "shellwords"
|
4
|
+
require "fileutils"
|
5
5
|
|
6
6
|
module Kitchen
|
7
7
|
module Transport
|
@@ -26,7 +26,7 @@ module Kitchen
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def state_filename
|
29
|
-
instance.instance_variable_get(
|
29
|
+
instance.instance_variable_get("@state_file").instance_variable_get("@file_name")
|
30
30
|
end
|
31
31
|
|
32
32
|
class Connection < Transport::Base::Connection
|
@@ -44,7 +44,7 @@ module Kitchen
|
|
44
44
|
# There are some bash-isms coming from chef_zero (in particular, multiple_converge)
|
45
45
|
# so let's wrap it
|
46
46
|
command = command.shelljoin if command.is_a? Array
|
47
|
-
command = [
|
47
|
+
command = ["bash", "-c", command]
|
48
48
|
res = nx_transport.execute(command, capture: true) do |stdout_chunk, stderr_chunk|
|
49
49
|
logger << stdout_chunk if stdout_chunk
|
50
50
|
logger << stderr_chunk if stderr_chunk
|
@@ -75,8 +75,8 @@ module Kitchen
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def login_command
|
78
|
-
args = [File.expand_path(
|
79
|
-
LoginCommand.new
|
78
|
+
args = [File.expand_path("../../../../bin/lxc-shell", __FILE__), state_filename]
|
79
|
+
LoginCommand.new "ruby", args
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
|
2
|
-
require
|
2
|
+
require "kitchen/verifier/base"
|
3
3
|
|
4
4
|
class Kitchen::Verifier::Inspec < Kitchen::Verifier::Base
|
5
5
|
def runner_options_for_lxd(config_data)
|
6
|
-
require
|
6
|
+
require "train/lxd"
|
7
7
|
return config_data.select { |k, _| [:config, :container_name, :username].include? k }.tap do |data|
|
8
|
-
data[:backend] =
|
8
|
+
data[:backend] = "lxd"
|
9
9
|
data[:logger] = logger
|
10
10
|
end
|
11
11
|
rescue LoadError
|
12
|
-
raise
|
12
|
+
raise "The `train-lxd` gem is required to run inspec for this container. Is it installed?"
|
13
13
|
end
|
14
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-lxd_sling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Zachariasen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lxd-common
|
@@ -157,6 +157,7 @@ executables: []
|
|
157
157
|
extensions: []
|
158
158
|
extra_rdoc_files: []
|
159
159
|
files:
|
160
|
+
- ".gitattributes"
|
160
161
|
- ".gitignore"
|
161
162
|
- ".kitchen.travis.yml"
|
162
163
|
- ".kitchen.yml"
|