chef-lxc 0.0.2.rc.1 → 0.0.2

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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NWJhM2RiZWFmYTljYzhkNWE5OTcxMjU3MTJmNTBkNDU0MTQ3YWUwMg==
5
- data.tar.gz: !binary |-
6
- MmM3ZTIyYzBmNjJkNzA5ZTk1NDMxMjk2ZDNkNDkxMDI2OGFlYTllNw==
2
+ SHA1:
3
+ metadata.gz: 74d567115ba049ac8952d5d82075fecf2ab633c5
4
+ data.tar.gz: 709b4aab0423d46cec4e2af27fe4c9e2be49e814
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MzhmODNiNDI5NTlmOGUyNGEyYzQwOTBhY2ZhZmVhNTY3YmUxMDY4M2U2ZDZk
10
- YjYwNGViOWQ0NzVjMDRiNDVkNDI1ZGJjNzMxZWViNjE5ODQwNWI1ZDhiZTA0
11
- ZjE4NDczZDlkZTViZTFiNGM5NzcwMmY3NGJiY2JjNDBjNTUyM2I=
12
- data.tar.gz: !binary |-
13
- NDRmYWVjMzZjYWZkMDcwYTBlMjA0Y2YzYWYzMTMxMDg4NDk1MGVjMTZlODg4
14
- MTAzZDlkY2MzZjQ0OGNjODkzYTE3NzlmOTg0YWQyMDg1MzViNzMzM2I2YWUw
15
- NTViNDA2YzMyNDMyNTFiZmUwZDI0MWVjZmE5OGVkNDc3ZjYxMWY=
6
+ metadata.gz: a23cbddca704a52d4999cccf55d6fc9df02137fc8aeecdd6935f59d618180d260de1c8da1170af9916806e638c56d054b1d95bbf4107263cdb170e4cd0c6ed66
7
+ data.tar.gz: b6ac7276e06f35163ca876fbe9e4b56c15b0a628f175fd4b67cf5763856eee2f751c5527a65b6d827243380df88f85d3370567d6e255380ea94f7bbdffd1f843
data/Gemfile CHANGED
@@ -3,3 +3,5 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
  gem 'serverspec'
5
5
  gem 'specinfra', github: 'ranjib/specinfra', branch: 'lxc'
6
+ gem 'ruby-lxc'
7
+ gem 'pry'
data/chef-lxc.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
  spec.bindir = "bin"
21
21
 
22
- spec.add_dependency "chef", "= 11.8.4.ohai7.0"
22
+ spec.add_dependency "chef", ">= 11"
23
23
  spec.add_dependency "ruby-lxc"
24
24
  spec.add_dependency "lxc-extra"
25
25
  spec.homepage = 'https://github.com/ranjib/chef-lxc'
@@ -1,16 +1,18 @@
1
1
  require 'chef'
2
2
  require 'highline'
3
- require 'chef/lxc'
4
3
  require 'chef/application'
5
4
  require 'chef/client'
6
5
  require 'chef/config'
7
6
  require 'chef/log'
7
+ require 'chef/lxc_helper'
8
8
  require 'fileutils'
9
9
  require 'tempfile'
10
10
  require 'chef/providers'
11
11
  require 'chef/resources'
12
+ require 'digest/md5'
12
13
 
13
14
  class Chef::Application::LXC < Chef::Application
15
+ include Chef::LXCHelper
14
16
 
15
17
  banner "Usage: chef-lxc CONTAINER [RECIPE_FILE] [-e RECIPE_TEXT] [-s]"
16
18
 
@@ -81,25 +83,7 @@ class Chef::Application::LXC < Chef::Application
81
83
  end
82
84
  Chef::Config[:solo] = true
83
85
  ct = ::LXC::Container.new(ARGV.first)
84
- client.ohai.load_plugins
85
- ct.execute do
86
- client.run_ohai
87
- client.load_node
88
- client.build_node
89
- run_context = Chef::RunContext.new(client.node, {}, client.events)
90
- recipe = Chef::Recipe.new("(chef-lxc cookbook)", "(chef-lxc recipe)", run_context)
91
- recipe.instance_eval(recipe_text, '/foo/bar.rb', 1)
92
- runner = Chef::Runner.new(run_context)
93
- runner.converge
94
- end
95
- end
96
-
97
- def client
98
- @client ||= Class.new(Chef::Client) do
99
- def run_ohai
100
- ohai.run_plugins
101
- end
102
- end.new
86
+ recipe_in_container(ct, text: recipe_text)
103
87
  end
104
88
 
105
89
  def run_application
@@ -1,5 +1,5 @@
1
1
  class Chef
2
2
  module LXC
3
- VERSION = "0.0.2.rc.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
data/lib/chef/lxc.rb CHANGED
@@ -1,10 +1,3 @@
1
- require 'lxc'
2
- require 'lxc/extra'
3
- require 'chef/lxc/version'
4
- require 'chef/provider/lxc'
1
+ require 'chef/lxc_helper'
5
2
  require 'chef/resource/lxc'
6
-
7
- class Chef
8
- module LXC
9
- end
10
- end
3
+ require 'chef/provider/lxc'
@@ -0,0 +1,31 @@
1
+ require 'lxc'
2
+ require 'lxc/extra'
3
+
4
+ class Chef
5
+ module LXCHelper
6
+ def recipe_in_container(ct, options={})
7
+ client = Class.new(Chef::Client) do
8
+ def run_ohai
9
+ ohai.run_plugins
10
+ end
11
+ end.new
12
+ client.ohai.load_plugins
13
+ ct.execute do
14
+ Chef::Config[:solo] = true
15
+ client.run_ohai
16
+ client.load_node
17
+ client.build_node
18
+ run_context = Chef::RunContext.new(client.node, {}, client.events)
19
+ recipe = Chef::Recipe.new("chef-loxc-cookbook", "chef-lxc-recipe", run_context)
20
+ if options[:block]
21
+ recipe.instance_eval(&new_resource.recipe_block)
22
+ elsif options[:text]
23
+ recipe.instance_eval(options[:text], __FILE__, __LINE__)
24
+ else
25
+ end
26
+ runner = Chef::Runner.new(run_context)
27
+ runner.converge
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,9 +1,9 @@
1
- require 'chef/provider'
2
- require 'lxc'
1
+ require 'chef/lxc_helper'
3
2
 
4
3
  class Chef
5
4
  class Provider
6
5
  class Lxc < Chef::Provider
6
+ include Chef::LXCHelper
7
7
 
8
8
  attr_reader :ct
9
9
 
@@ -26,14 +26,33 @@ class Chef
26
26
  unless ct.defined?
27
27
  converge_by("create container '#{ct.name}'") do
28
28
  template = new_resource.lxc_template.type
29
- block_device = new_resource.lxc_template.bd
30
29
  template_options = new_resource.lxc_template.options
31
30
  flags = 0
32
- ct.create(template, block_device, flags, template_options)
31
+ ct.create(
32
+ new_resource.lxc_template.type,
33
+ new_resource.block_device,
34
+ new_resource.bdev_specs,
35
+ new_resource.flags,
36
+ new_resource.lxc_template.options
37
+ )
38
+ update_config
33
39
  end
34
40
  end
35
41
  end
36
42
 
43
+ def update_config
44
+ updated_items = []
45
+ new_resource.config.each do |key, expected_value|
46
+ if ct.config_item(key) != expected_value
47
+ ct.set_config_item(key, expected_value)
48
+ updated_items << key
49
+ end
50
+ end
51
+ unless updated_items.empty?
52
+ ct.save_config
53
+ end
54
+ end
55
+
37
56
  def action_stop
38
57
  if ct.running?
39
58
  converge_by("stop container '#{ct.name}'") do
@@ -42,14 +61,26 @@ class Chef
42
61
  end
43
62
  end
44
63
 
64
+ def action_reboot
65
+ converge_by("reboot container '#{ct.name}'") do
66
+ ct.reboot
67
+ end
68
+ end
69
+
45
70
  def action_start
46
71
  unless ct.running?
47
72
  converge_by("start container '#{ct.name}'") do
48
73
  ct.start
74
+ if new_resource.wait_for_network
75
+ until ct.ip_addresses.empty?
76
+ Chef::Log.debug('waiting for ip allocation')
77
+ sleep 1
78
+ end
79
+ end
49
80
  end
50
81
  end
51
82
  unless new_resource.recipe_block.nil?
52
- run_recipe
83
+ recipe_in_container(ct, block: new_resource.recipe_block)
53
84
  end
54
85
  end
55
86
 
@@ -60,29 +91,6 @@ class Chef
60
91
  end
61
92
  end
62
93
  end
63
-
64
- def run_recipe
65
- client.ohai.load_plugins
66
- ct.execute do
67
- Chef::Config[:solo] = true
68
- client.run_ohai
69
- client.load_node
70
- client.build_node
71
- run_context = Chef::RunContext.new(client.node, {}, client.events)
72
- recipe = Chef::Recipe.new(new_resource.name,'inline', run_context)
73
- recipe.instance_eval(&new_resource.recipe_block)
74
- runner = Chef::Runner.new(run_context)
75
- runner.converge
76
- end
77
- end
78
-
79
- def client
80
- @client ||= Class.new(Chef::Client) do
81
- def run_ohai
82
- ohai.run_plugins
83
- end
84
- end.new
85
- end
86
94
  end
87
95
  end
88
96
  end
@@ -4,24 +4,17 @@ class Chef
4
4
  class Resource
5
5
  class Lxc < Chef::Resource
6
6
 
7
- class InlineRecipe
8
- end
9
-
10
7
  class LXCTemplate
11
- attr_reader :type, :bd, :options
12
- def initialize(type='ubuntu')
8
+ attr_reader :type, :options
9
+
10
+ def initialize(type='download')
13
11
  @type = type
14
- @bd = nil
15
- @options = []
12
+ @options = %w{-d ubuntu -r trusty -a amd64}
16
13
  end
17
14
 
18
15
  def args(args)
19
16
  @options = args
20
17
  end
21
-
22
- def block_device(bd)
23
- @bd = bd
24
- end
25
18
  end
26
19
 
27
20
  identity_attr :container_name
@@ -33,15 +26,40 @@ class Chef
33
26
  @container_name = name
34
27
  @provider = Chef::Provider::Lxc
35
28
  @action = :create
36
- @allowed_actions += [:start, :stop, :destroy, :create]
29
+ @allowed_actions += [:start, :stop, :destroy, :create, :reboot]
37
30
  @lxc_template = LXCTemplate.new
38
31
  @recipe_block = nil
32
+ @block_device = nil
33
+ @bdev_specs = {}
34
+ @flags = 0
35
+ @config = {}
36
+ @wait_for_network = true
39
37
  end
40
38
 
41
39
  def container_name(arg = nil)
42
40
  set_or_return(:container_name, arg, kind_of: [ String ] )
43
41
  end
44
42
 
43
+ def wait_for_network(arg = nil)
44
+ set_or_return(:wait_for_network, arg, kind_of: [ TrueClass, FalseClass ] )
45
+ end
46
+
47
+ def config(arg=nil)
48
+ set_or_return(:config, arg, kind_of: [ Hash ] )
49
+ end
50
+
51
+ def flags(arg = nil)
52
+ set_or_return(:flags, arg, kind_of: [ Fixnum ] )
53
+ end
54
+
55
+ def block_device(arg = nil)
56
+ set_or_return(:block_device, arg, kind_of: [ String ] )
57
+ end
58
+
59
+ def bdev_specs(arg = nil)
60
+ set_or_return(:bdev_specs, arg, kind_of: [ Hash ] )
61
+ end
62
+
45
63
  def template(type = 'ubuntu', &block)
46
64
  @lxc_template = LXCTemplate.new(type)
47
65
  if block_given?
@@ -9,17 +9,20 @@ describe 'inline recipe' do
9
9
  before(:all) do
10
10
  execute_recipe('recipe.rb')
11
11
  end
12
+ after(:all) do
13
+ destroy_ct
14
+ end
12
15
 
13
16
  let(:ct) do
14
17
  LXC::Container.new('chef')
15
18
  end
16
19
 
17
20
  it 'container should be created' do
18
- expect(ct.defined?).to be_true
21
+ expect(ct.defined?).to be(true)
19
22
  end
20
23
 
21
24
  it 'container should be running' do
22
- expect(ct.running?).to be_true
25
+ expect(ct.running?).to be(true)
23
26
  end
24
27
 
25
28
  it 'should create test directory' do
@@ -9,16 +9,19 @@ describe 'Chef lxc resource/provider' do
9
9
  before(:all) do
10
10
  execute_recipe('simple.rb')
11
11
  end
12
+ after(:all) do
13
+ destroy_ct
14
+ end
12
15
 
13
16
  let(:ct) do
14
17
  LXC::Container.new('chef')
15
18
  end
16
19
 
17
20
  it 'should create the container' do
18
- expect(ct.defined?).to be_true
21
+ expect(ct.defined?).to be(true)
19
22
  end
20
23
 
21
24
  it 'should not start the container' do
22
- expect(ct.running?).to be_false
25
+ expect(ct.running?).to be(false)
23
26
  end
24
27
  end
@@ -10,22 +10,26 @@ describe 'Chef lxc resource/provider' do
10
10
  execute_recipe('template.rb')
11
11
  end
12
12
 
13
+ after(:all) do
14
+ destroy_ct
15
+ end
16
+
13
17
  let(:ct) do
14
18
  LXC::Container.new('chef')
15
19
  end
16
20
 
17
21
  it 'container should be created' do
18
- expect(ct.defined?).to be_true
22
+ expect(ct.defined?).to be(true)
19
23
  end
20
24
 
21
25
  it 'container should be running' do
22
- expect(ct.running?).to be_true
26
+ expect(ct.running?).to be(true)
23
27
  end
24
28
 
25
- it 'container should be ubuntu 10.04' do
29
+ it 'container should be ubuntu 14.04' do
26
30
  version = ct.execute do
27
31
  `lsb_release -a`
28
32
  end
29
- expect(version).to match(/10\.04/)
33
+ expect(version).to match(/14\.04/)
30
34
  end
31
35
  end
@@ -4,12 +4,11 @@ require 'chef/application/lxc'
4
4
  describe Chef::Application::LXC do
5
5
  before(:all) do
6
6
  c = LXC::Container.new('test')
7
- c.create('ubuntu') unless c.defined?
7
+ c.create('download', nil, {}, 0, %w{-d ubuntu -r trusty -a amd64}) unless c.defined?
8
8
  c.start unless c.running?
9
9
  end
10
10
  after(:all) do
11
- c = LXC::Container.new('test')
12
- c.stop if c.running?
11
+ destroy_ct
13
12
  end
14
13
  it 'should install a package inside a container' do
15
14
  app = Chef::Application::LXC.new
data/spec/data/recipe.rb CHANGED
@@ -1,12 +1,18 @@
1
1
  require 'chef/lxc'
2
2
 
3
3
  lxc 'chef' do
4
- recipe do
5
-
6
- directory '/opt/test'
7
4
 
8
- package 'apache2'
5
+ template 'download' do
6
+ args ['-d', 'ubuntu', '-r', 'trusty', '-a', 'amd64']
7
+ end
9
8
 
9
+ recipe do
10
+ execute 'sleep 10'
11
+ execute 'apt-get update -y'
12
+ directory '/opt/test'
13
+ package 'apache2' do
14
+ retries 5
15
+ end
10
16
  service 'apache2' do
11
17
  action [:start, :enable]
12
18
  end
@@ -2,8 +2,8 @@ require 'chef/lxc'
2
2
 
3
3
  lxc "chef" do
4
4
 
5
- template "ubuntu" do
6
- args %w{-r lucid}
5
+ template "download" do
6
+ args %w{-r trusty -d ubuntu -a amd64}
7
7
  end
8
8
 
9
9
  action [:create, :start]
data/spec/spec_helper.rb CHANGED
@@ -17,6 +17,11 @@ module LXCSpecHelper
17
17
  command.run_command
18
18
  command
19
19
  end
20
+ def destroy_ct
21
+ c = LXC::Container.new('chef')
22
+ c.stop if c.running?
23
+ c.destroy if c.defined?
24
+ end
20
25
  end
21
26
 
22
27
  RSpec.configure do |config|
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-lxc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.rc.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ranjib Dey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-20 00:00:00.000000000 Z
11
+ date: 2014-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 11.8.4.ohai7.0
19
+ version: '11'
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: 11.8.4.ohai7.0
26
+ version: '11'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-lxc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: lxc-extra
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.3'
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
68
  version: '1.3'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ! '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: chef-zero
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ! '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ! '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  description: LXC bindings for Chef
@@ -116,7 +116,7 @@ executables:
116
116
  extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
- - .gitignore
119
+ - ".gitignore"
120
120
  - Gemfile
121
121
  - LICENSE.txt
122
122
  - README.md
@@ -126,6 +126,7 @@ files:
126
126
  - lib/chef/application/lxc.rb
127
127
  - lib/chef/lxc.rb
128
128
  - lib/chef/lxc/version.rb
129
+ - lib/chef/lxc_helper.rb
129
130
  - lib/chef/provider/lxc.rb
130
131
  - lib/chef/resource/lxc.rb
131
132
  - spec/chef/recipe_spec.rb
@@ -146,17 +147,17 @@ require_paths:
146
147
  - lib
147
148
  required_ruby_version: !ruby/object:Gem::Requirement
148
149
  requirements:
149
- - - ! '>='
150
+ - - ">="
150
151
  - !ruby/object:Gem::Version
151
152
  version: '0'
152
153
  required_rubygems_version: !ruby/object:Gem::Requirement
153
154
  requirements:
154
- - - ! '>'
155
+ - - ">="
155
156
  - !ruby/object:Gem::Version
156
- version: 1.3.1
157
+ version: '0'
157
158
  requirements: []
158
159
  rubyforge_project:
159
- rubygems_version: 2.1.11
160
+ rubygems_version: 2.2.2
160
161
  signing_key:
161
162
  specification_version: 4
162
163
  summary: LXC bindings for Chef