chef-lxc 0.0.2.rc.1 → 0.0.2

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