kitchen-lxd 0.2.2 → 0.3.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +21 -6
- data/lib/kitchen/driver/lxd.rb +21 -17
- data/lib/kitchen/driver/lxd/container.rb +34 -27
- data/lib/kitchen/driver/version.rb +6 -4
- data/lib/kitchen/transport/lxd.rb +10 -8
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f28028bf2f69eaa9be7c98c1bb0f68ed5303be9e
|
4
|
+
data.tar.gz: 9d39f38481d261a1ebf3f2c1828a3630c8d2cbb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e223c9baca53df42e742e0367d69f64938a4e6da4e9cfdff50f75b700ce012c91ccaa04dc4f5776d0b9fa7ca1035f1d9c1228d3fc3f62f48467fdec2e8cb8746
|
7
|
+
data.tar.gz: 0da0cf8822f0a5414fcca6c153d83178934668c1ce0b3b0ab6590be32da89729bd2b4dd070ea7199ec099e45a282259f698908e1ff6b65f1d2373f9c41be9095
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Kitchen::Lxd
|
2
2
|
|
3
|
+
[author]: https://github.com/DracoAter
|
4
|
+
[issues]: https://github.com/DracoAter/kitchen-lxd/issues
|
5
|
+
[license]: https://github.com/DracoAter/kitchen-lxd/blob/master/LICENSE
|
6
|
+
[repo]: https://github.com/DracoAter/kitchen-lxd
|
7
|
+
[hostnamectl bug]: https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1575779
|
8
|
+
[lxd_doc]: https://github.com/lxc/lxd/blob/master/doc/containers.md
|
9
|
+
|
3
10
|
[](https://travis-ci.org/DracoAter/kitchen-lxd)
|
4
11
|
[](https://badge.fury.io/rb/kitchen-lxd)
|
5
12
|
|
@@ -49,6 +56,7 @@ driver:
|
|
49
56
|
network: lxdbr0 # default
|
50
57
|
fix_chef_install: false # default
|
51
58
|
fix_hostnamectl_bug: true # default
|
59
|
+
config: {} # default
|
52
60
|
|
53
61
|
transport:
|
54
62
|
name: lxd
|
@@ -65,6 +73,17 @@ transport:
|
|
65
73
|
name: lxd
|
66
74
|
```
|
67
75
|
|
76
|
+
You can specify different keys/values under `config`. Look for list of the available items in
|
77
|
+
[Lxd Documentation][lxd_doc]. For example, if you need to start container in privileged mode, add:
|
78
|
+
|
79
|
+
```yaml
|
80
|
+
---
|
81
|
+
driver:
|
82
|
+
name:lxd
|
83
|
+
config:
|
84
|
+
security.privileged: true
|
85
|
+
```
|
86
|
+
|
68
87
|
### Driver
|
69
88
|
|
70
89
|
Available options:
|
@@ -75,8 +94,9 @@ binary | Path to lxc executable. | String | `lxc`
|
|
75
94
|
remote | Remote LXD server to download image from, if it does not exist locally. | String | `images`
|
76
95
|
network | Network bridge to attach to container. | String | `lxdbr0`
|
77
96
|
wait_until_ready | Wait for the network to come up. | Boolean | `true`
|
97
|
+
config | Config key/value to apply to the new container. This hash is passed to `lxc init` command as --config parameters. | Hash | `{}`
|
78
98
|
fix_chef_install | Apply fix, to make available installation of Chef Omnibus package. | Boolean | `false`
|
79
|
-
fix_hostnamectl_bug | Apply workaround to Ubuntu [hostnamectl bug]
|
99
|
+
fix_hostnamectl_bug | Apply workaround to Ubuntu [hostnamectl bug][hostnamectl bug] in LXD. | Boolean | `true`
|
80
100
|
|
81
101
|
## Development
|
82
102
|
|
@@ -100,8 +120,3 @@ Created and maintained by [Juri Timošin][author].
|
|
100
120
|
## License
|
101
121
|
|
102
122
|
Apache 2.0 (see [LICENSE][license])
|
103
|
-
|
104
|
-
[author]: https://github.com/DracoAter
|
105
|
-
[issues]: https://github.com/DracoAter/kitchen-lxd/issues
|
106
|
-
[license]: https://github.com/DracoAter/kitchen-lxd/blob/master/LICENSE
|
107
|
-
[repo]: https://github.com/DracoAter/kitchen-lxd
|
data/lib/kitchen/driver/lxd.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
|
-
# Author:: Juri
|
5
|
+
# Author:: Juri Timoshin (<draco.ater@gmail.com>)
|
4
6
|
#
|
5
|
-
# Copyright (C) 2017, Juri
|
7
|
+
# Copyright (C) 2017, Juri Timoshin
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
10
|
# you may not use this file except in compliance with the License.
|
@@ -23,8 +25,9 @@ module Kitchen
|
|
23
25
|
module Driver
|
24
26
|
# Lxd driver for Kitchen.
|
25
27
|
#
|
26
|
-
# @author Juri
|
28
|
+
# @author Juri Timoshin <draco.ater@gmail.com>
|
27
29
|
class Lxd < Kitchen::Driver::Base
|
30
|
+
include ShellOut
|
28
31
|
MIN_LXD_VERSION = '2.3'
|
29
32
|
|
30
33
|
kitchen_driver_api_version 2
|
@@ -32,6 +35,7 @@ module Kitchen
|
|
32
35
|
default_config :binary, 'lxc'
|
33
36
|
default_config :remote, 'images'
|
34
37
|
default_config :network, 'lxdbr0'
|
38
|
+
default_config :config, {}
|
35
39
|
default_config :wait_until_ready, true
|
36
40
|
default_config :fix_chef_install, false
|
37
41
|
default_config :fix_hostnamectl_bug, true # https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1575779
|
@@ -44,33 +48,33 @@ module Kitchen
|
|
44
48
|
driver.instance.name
|
45
49
|
end
|
46
50
|
|
47
|
-
def create(
|
48
|
-
container.init
|
51
|
+
def create(state)
|
52
|
+
container.init(config[:config])
|
49
53
|
container.attach_network config[:network] if config[:network]
|
50
54
|
container.start
|
51
55
|
|
52
|
-
|
53
|
-
|
56
|
+
if config[:wait_until_ready]
|
57
|
+
state[:hostname] = instance.transport.connection(state).wait_until_ready
|
58
|
+
end
|
59
|
+
container.fix_chef_install(instance.platform.name) if config[:fix_chef_install]
|
54
60
|
container.fix_hostnamectl_bug if config[:fix_hostnamectl_bug]
|
55
61
|
end
|
56
62
|
|
57
|
-
def destroy(
|
58
|
-
instance.transport.connection(
|
63
|
+
def destroy(state)
|
64
|
+
instance.transport.connection(state).close
|
59
65
|
state.delete :hostname
|
60
66
|
container.destroy
|
61
67
|
end
|
62
68
|
|
63
69
|
def verify_dependencies
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
"#{MIN_LXD_VERSION} or higher."
|
69
|
-
end
|
70
|
+
version = run_command("#{config[:binary]} --version").strip
|
71
|
+
return if Gem::Version.new(version) >= Gem::Version.new(MIN_LXD_VERSION)
|
72
|
+
raise UserError, "Detected old version of Lxd (#{version}), please upgrade to version "\
|
73
|
+
"#{MIN_LXD_VERSION} or higher."
|
70
74
|
end
|
71
75
|
|
72
76
|
def container
|
73
|
-
@container ||= Lxd::Container.new(
|
77
|
+
@container ||= Lxd::Container.new(logger, config)
|
74
78
|
end
|
75
79
|
end
|
76
80
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
|
-
# Author:: Juri
|
5
|
+
# Author:: Juri Timoshin (<draco.ater@gmail.com>)
|
4
6
|
#
|
5
|
-
# Copyright (C) 2017, Juri
|
7
|
+
# Copyright (C) 2017, Juri Timoshin
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
10
|
# you may not use this file except in compliance with the License.
|
@@ -29,33 +31,35 @@ module Kitchen
|
|
29
31
|
attr_reader :logger
|
30
32
|
attr_reader :state
|
31
33
|
|
32
|
-
def initialize(
|
34
|
+
def initialize(logger, opts)
|
33
35
|
@logger = logger
|
34
36
|
@name = opts[:container]
|
35
37
|
@image = opts[:image]
|
36
38
|
@remote = opts[:remote]
|
37
39
|
@binary = opts[:binary]
|
40
|
+
@fix_hostnamectl_bug = opts[:fix_hostnamectl_bug]
|
38
41
|
end
|
39
42
|
|
40
|
-
def init
|
43
|
+
def init(config={})
|
41
44
|
return if created?
|
42
45
|
download_image unless image_exists?
|
43
|
-
|
46
|
+
config_args = config.map{|k, v| "-c #{k}='#{v}'" }.join(' ')
|
47
|
+
run_command "#{@binary} init #{@image} #{@name} #{config_args}"
|
44
48
|
end
|
45
49
|
|
46
|
-
def attach_network(
|
50
|
+
def attach_network(network)
|
47
51
|
return if device_attached? network
|
48
|
-
run_command "
|
52
|
+
run_command "#{@binary} network attach #{network} #{@name}"
|
49
53
|
end
|
50
54
|
|
51
55
|
def start
|
52
56
|
return if running?
|
53
|
-
run_command "
|
57
|
+
run_command "#{@binary} start #{@name}"
|
54
58
|
end
|
55
59
|
|
56
60
|
def destroy
|
57
61
|
return unless created?
|
58
|
-
run_command "
|
62
|
+
run_command "#{@binary} delete #{@name} --force"
|
59
63
|
end
|
60
64
|
|
61
65
|
def wait_until_ready
|
@@ -66,55 +70,58 @@ module Kitchen
|
|
66
70
|
i[:family] == 'inet'
|
67
71
|
end
|
68
72
|
return inet[:address] if inet
|
69
|
-
sleep 1 unless defined?(
|
73
|
+
sleep 1 unless defined?(Kitchen::Driver::UnitTest)
|
70
74
|
end
|
71
75
|
nil
|
72
76
|
end
|
73
77
|
|
74
78
|
def download_image
|
75
|
-
run_command "
|
79
|
+
run_command "#{@binary} image copy --copy-aliases #{@remote}:#{@image} local:"
|
76
80
|
end
|
77
81
|
|
78
|
-
def execute(
|
82
|
+
def execute(command)
|
79
83
|
return if command.nil? or command.empty?
|
80
|
-
|
84
|
+
fix_hostnamectl_bug if @fix_hostnamectl_bug
|
85
|
+
run_command "#{@binary} exec #{@name} -- #{command}"
|
81
86
|
end
|
82
87
|
|
83
88
|
def login_command
|
84
|
-
LoginCommand.new(
|
89
|
+
LoginCommand.new("#{@binary} exec #{@name} -- $(#{@binary} exec #{@name} -- head -1 "\
|
90
|
+
'/etc/passwd | cut -d: -f7)', {})
|
85
91
|
end
|
86
92
|
|
87
|
-
def upload(
|
88
|
-
|
89
|
-
run_command "
|
93
|
+
def upload(locals, remote)
|
94
|
+
return if locals.nil? or locals.empty?
|
95
|
+
run_command "#{@binary} file push -r #{locals.join(' ')} #{@name}#{remote}"
|
90
96
|
end
|
91
97
|
|
92
|
-
def fix_chef_install(
|
98
|
+
def fix_chef_install(platform)
|
93
99
|
case platform
|
94
100
|
when /ubuntu/, /debian/
|
95
|
-
execute
|
101
|
+
execute 'apt-get update'
|
102
|
+
execute 'apt-get install -y wget'
|
96
103
|
when /rhel/, /centos/
|
97
104
|
execute 'yum install -y sudo wget'
|
98
105
|
end
|
99
106
|
end
|
100
107
|
|
101
108
|
def fix_hostnamectl_bug
|
102
|
-
logger.info
|
103
|
-
|
104
|
-
|
109
|
+
logger.info 'Replace /usr/bin/hostnamectl with /usr/bin/true, because of bug in Ubuntu'\
|
110
|
+
'. (https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1575779)'
|
111
|
+
run_command "#{@binary} exec #{@name} -- ln -fs /usr/bin/true /usr/bin/hostnamectl"
|
105
112
|
end
|
106
113
|
|
107
|
-
# private
|
114
|
+
# private
|
108
115
|
|
109
116
|
def image_exists?
|
110
117
|
!JSON.parse(
|
111
|
-
run_command(
|
118
|
+
run_command("#{@binary} image list #{@image} --format json"), symbolize_names: true
|
112
119
|
).empty?
|
113
120
|
end
|
114
121
|
|
115
122
|
def fetch_state
|
116
123
|
@state = JSON.parse(
|
117
|
-
run_command(
|
124
|
+
run_command("#{@binary} list #{@name} --format json"), symbolize_names: true
|
118
125
|
).first
|
119
126
|
end
|
120
127
|
|
@@ -126,7 +133,7 @@ module Kitchen
|
|
126
133
|
!fetch_state.nil?
|
127
134
|
end
|
128
135
|
|
129
|
-
def device_attached?(
|
136
|
+
def device_attached?(network)
|
130
137
|
fetch_state.dig(:devices, network.to_sym) ? true : false
|
131
138
|
end
|
132
139
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
|
-
# Author:: Juri
|
5
|
+
# Author:: Juri Timoshin (<draco.ater@gmail.com>)
|
4
6
|
#
|
5
|
-
# Copyright (C) 2017, Juri
|
7
|
+
# Copyright (C) 2017, Juri Timoshin
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
10
|
# you may not use this file except in compliance with the License.
|
@@ -20,7 +22,7 @@ module Kitchen
|
|
20
22
|
module Driver
|
21
23
|
class Lxd
|
22
24
|
# Version string for Lxd Kitchen driver
|
23
|
-
VERSION = '0.
|
25
|
+
VERSION = '0.3.0'
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
|
-
# Author:: Juri
|
5
|
+
# Author:: Juri Timoshin (<draco.ater@gmail.com>)
|
4
6
|
#
|
5
|
-
# Copyright (C) 2017, Juri
|
7
|
+
# Copyright (C) 2017, Juri Timoshin
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
10
|
# you may not use this file except in compliance with the License.
|
@@ -23,7 +25,7 @@ module Kitchen
|
|
23
25
|
module Transport
|
24
26
|
# Transport for Lxd driver for Kitchen.
|
25
27
|
#
|
26
|
-
# @author Juri
|
28
|
+
# @author Juri Timoshin <draco.ater@gmail.com>
|
27
29
|
class Lxd < Base
|
28
30
|
kitchen_transport_api_version 2
|
29
31
|
|
@@ -31,16 +33,16 @@ module Kitchen
|
|
31
33
|
transport.instance.driver.container
|
32
34
|
end
|
33
35
|
|
34
|
-
def connection(
|
35
|
-
@connection = Connection.new(
|
36
|
+
def connection(state, &block)
|
37
|
+
@connection = Connection.new(config.to_hash.merge(state), &block)
|
36
38
|
end
|
37
39
|
|
38
40
|
class Connection < Base::Connection
|
39
41
|
extend Forwardable
|
40
42
|
|
41
|
-
def initialize(
|
43
|
+
def initialize(opts)
|
42
44
|
@container = opts[:container]
|
43
|
-
super(
|
45
|
+
super(opts)
|
44
46
|
end
|
45
47
|
|
46
48
|
def_delegators :@container, :execute, :login_command, :upload, :wait_until_ready
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-lxd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juri Timošin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-kitchen
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.17'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ci_reporter_minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,19 +53,19 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '12.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '12.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|