vagabond 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +18 -0
- data/README.md +125 -4
- data/bin/vagabond +43 -16
- data/lib/vagabond/actions/cluster.rb +66 -0
- data/lib/vagabond/actions/create.rb +12 -7
- data/lib/vagabond/actions/destroy.rb +69 -15
- data/lib/vagabond/actions/init.rb +75 -0
- data/lib/vagabond/actions/provision.rb +4 -2
- data/lib/vagabond/actions/status.rb +33 -22
- data/lib/vagabond/actions/up.rb +8 -1
- data/lib/vagabond/bootstraps/server-zero.erb +20 -0
- data/lib/vagabond/bootstraps/server.erb +3 -2
- data/lib/vagabond/constants.rb +0 -15
- data/lib/vagabond/cookbooks/lxc/CHANGELOG.md +16 -0
- data/lib/vagabond/cookbooks/lxc/Gemfile +3 -2
- data/lib/vagabond/cookbooks/lxc/Gemfile.lock +30 -121
- data/lib/vagabond/cookbooks/lxc/README.md +43 -14
- data/lib/vagabond/cookbooks/lxc/attributes/default.rb +3 -3
- data/lib/vagabond/cookbooks/lxc/files/default/lxc-awesome-ephemeral +499 -0
- data/lib/vagabond/cookbooks/lxc/libraries/lxc.rb +223 -58
- data/lib/vagabond/cookbooks/lxc/libraries/lxc_file_config.rb +3 -0
- data/lib/vagabond/cookbooks/lxc/libraries/monkey.rb +51 -0
- data/lib/vagabond/cookbooks/lxc/metadata.rb +6 -5
- data/lib/vagabond/cookbooks/lxc/providers/config.rb +9 -16
- data/lib/vagabond/cookbooks/lxc/providers/container.rb +241 -229
- data/lib/vagabond/cookbooks/lxc/providers/default.rb +57 -0
- data/lib/vagabond/cookbooks/lxc/providers/ephemeral.rb +40 -0
- data/lib/vagabond/cookbooks/lxc/providers/fstab.rb +13 -54
- data/lib/vagabond/cookbooks/lxc/providers/interface.rb +13 -67
- data/lib/vagabond/cookbooks/lxc/providers/service.rb +14 -14
- data/lib/vagabond/cookbooks/lxc/recipes/default.rb +17 -4
- data/lib/vagabond/cookbooks/lxc/recipes/install_dependencies.rb +1 -1
- data/lib/vagabond/cookbooks/lxc/resources/config.rb +2 -2
- data/lib/vagabond/cookbooks/lxc/resources/container.rb +31 -6
- data/lib/vagabond/cookbooks/lxc/resources/default.rb +12 -0
- data/lib/vagabond/cookbooks/lxc/resources/ephemeral.rb +13 -0
- data/lib/vagabond/cookbooks/lxc/resources/fstab.rb +2 -1
- data/lib/vagabond/cookbooks/lxc/resources/interface.rb +6 -3
- data/lib/vagabond/cookbooks/lxc/resources/service.rb +1 -1
- data/lib/vagabond/cookbooks/lxc/templates/default/file_content.erb +2 -0
- data/lib/vagabond/cookbooks/lxc/templates/default/interface.erb +9 -3
- data/lib/vagabond/cookbooks/vagabond/README.md +10 -0
- data/lib/vagabond/cookbooks/vagabond/attributes/default.rb +1 -0
- data/lib/vagabond/cookbooks/vagabond/files/default/lxc-centos +13 -6
- data/lib/vagabond/cookbooks/vagabond/metadata.rb +1 -0
- data/lib/vagabond/cookbooks/vagabond/recipes/default.rb +46 -4
- data/lib/vagabond/cookbooks/vagabond/recipes/zero.rb +9 -0
- data/lib/vagabond/errors.rb +23 -0
- data/lib/vagabond/helpers.rb +41 -14
- data/lib/vagabond/internal_configuration.rb +120 -27
- data/lib/vagabond/kitchen.rb +143 -63
- data/lib/vagabond/knife.rb +8 -5
- data/lib/vagabond/layout.rb +16 -0
- data/lib/vagabond/monkey/kitchen_config.rb +23 -0
- data/lib/vagabond/server.rb +79 -63
- data/lib/vagabond/spec.rb +345 -0
- data/lib/vagabond/uploader.rb +30 -0
- data/lib/vagabond/uploader/berkshelf.rb +53 -0
- data/lib/vagabond/uploader/knife.rb +24 -0
- data/lib/vagabond/uploader/librarian.rb +31 -0
- data/lib/vagabond/vagabond.rb +30 -11
- data/lib/vagabond/vagabondfile.rb +40 -5
- data/lib/vagabond/version.rb +1 -1
- data/vagabond.gemspec +5 -2
- metadata +75 -15
- data/lib/vagabond/cookbooks/lxc/resources/#container.rb# +0 -28
- data/lib/vagabond/cookbooks/lxc/test/kitchen/Kitchenfile +0 -7
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/metadata.rb +0 -2
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/centos_lxc.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/chef-bootstrap.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/lxc_files.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/lxc_templates.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/ubuntu_lxc.rb +0 -0
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## v0.2.2
|
2
|
+
* Migration to elecksee gem for LXC management
|
3
|
+
* Addition of chef-zero support for local chef server
|
4
|
+
* Updated testing for standalone cookbook testing
|
5
|
+
* Updated support for dependency resolvers (librarian and berkshelf)
|
6
|
+
* Addition of `spec` support
|
7
|
+
* Better isolation around sudo usage
|
8
|
+
* Cleaned `internal_configuration` and added automatic reloading on detected changes
|
9
|
+
* Added `cluster` support to Vagabondfile for easily building multiple nodes
|
10
|
+
* New `init` command for base setup
|
11
|
+
* Lots and lots of bug fixes and feature enhancements
|
12
|
+
* Output relevant information on bad command
|
13
|
+
* Huge thanks to all those that helped test, debug, and add features especially:
|
14
|
+
* Jesse Nelson - https://github.com/spheromak
|
15
|
+
* Bryan Berry - https://github.com/bryanwb
|
16
|
+
* Sean Escriva - https://github.com/webframp
|
17
|
+
|
18
|
+
|
1
19
|
## v0.2.0
|
2
20
|
* Migrate to thor
|
3
21
|
* Clean up option usage
|
data/README.md
CHANGED
@@ -15,8 +15,8 @@ instead of full blown VMs which means things are faster. Lots
|
|
15
15
|
faster.
|
16
16
|
|
17
17
|
Vagabond is built for Chef. The tooling within Vagabond is targeted
|
18
|
-
at Chef.
|
19
|
-
|
18
|
+
at Chef. After the initial development has slowed, the Chef specifics
|
19
|
+
will be pulled into a plugin.
|
20
20
|
|
21
21
|
## Installation
|
22
22
|
|
@@ -29,7 +29,7 @@ $ gem install vagabond
|
|
29
29
|
## How does it work
|
30
30
|
|
31
31
|
Currently, this is built to run within a classic Chef repository.
|
32
|
-
It requires a `
|
32
|
+
It requires a `Vagabondfile` file, that simply outputs a Hash. The file
|
33
33
|
is Ruby though, so you can do lots of crazy stuff to build the
|
34
34
|
Hash you return. Heres a simple example:
|
35
35
|
|
@@ -58,6 +58,23 @@ Now, to create a node, simply run:
|
|
58
58
|
$ vagabond up db
|
59
59
|
```
|
60
60
|
|
61
|
+
This command will bootstrap the installation of LXC utilities and base
|
62
|
+
containers prior to starting up a linux container. It does this by
|
63
|
+
running the vagabond chef recipe embedded in this gem at
|
64
|
+
`lib/vagabond/cookbooks/vagabond/recipes/default.rb`.
|
65
|
+
|
66
|
+
To only prepare your system for LXC fun and generate a simple vagabond
|
67
|
+
file, do the following:
|
68
|
+
|
69
|
+
```
|
70
|
+
$ vagabond init
|
71
|
+
```
|
72
|
+
|
73
|
+
This command runs the chef recipe and generates a basic Vagabondfile and
|
74
|
+
creates the base containers specified in that file. Those base
|
75
|
+
containers are Ubuntu 12.04 and CentOS 6.3. This creation process will
|
76
|
+
take a while so now is a good time to get a fresh pot of coffee.
|
77
|
+
|
61
78
|
Pretty simple, right?
|
62
79
|
|
63
80
|
### Templates available
|
@@ -131,6 +148,103 @@ chef server. Looking for example? See the `USAGE` file!
|
|
131
148
|
|
132
149
|
Double awesome
|
133
150
|
|
151
|
+
## Infrastructure testing
|
152
|
+
|
153
|
+
Cookbook tests are great and they help keep cookbooks stable and prevent
|
154
|
+
regressions. But what about tests for integrating cookbooks into an existing
|
155
|
+
infrastructure? Or upgrading an existing cookbook? The tests bundled with
|
156
|
+
the cookbook can happily pass with no indication of how it may affect other
|
157
|
+
resources within the infrastructure. So lets fix this.
|
158
|
+
|
159
|
+
Currently infrastructure tests are built using serverspec[1]. Test kitchen support
|
160
|
+
for infrastructure testing is in the works, but is still a moving target. So
|
161
|
+
lets look at how we can set this up. First, initialize the specs:
|
162
|
+
|
163
|
+
```
|
164
|
+
$ vagabond spec init
|
165
|
+
```
|
166
|
+
|
167
|
+
Next, we need to define the layout of the infrastructure. This is done by
|
168
|
+
populating the `Layout` file in the `spec` directory. Just like everything
|
169
|
+
else, this is just a ruby file that is expected to spit out a Hash. An
|
170
|
+
example file would look like this:
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
# spec/Layout
|
174
|
+
{
|
175
|
+
:defaults => {
|
176
|
+
:platform => 'ubuntu_1204',
|
177
|
+
:environment => 'testing',
|
178
|
+
:union => 'aufs'
|
179
|
+
},
|
180
|
+
:definitions => {
|
181
|
+
:test_node => {
|
182
|
+
:run_list => %w(role[base])
|
183
|
+
}
|
184
|
+
},
|
185
|
+
:clusters => {
|
186
|
+
:my_cluster => {
|
187
|
+
:overrides => {
|
188
|
+
:environment => '_default'
|
189
|
+
},
|
190
|
+
:nodes => ['test_node'] * 3
|
191
|
+
}
|
192
|
+
}
|
193
|
+
}
|
194
|
+
```
|
195
|
+
|
196
|
+
### :defaults
|
197
|
+
|
198
|
+
These are the default configuration options used for creating the containers
|
199
|
+
for testing. These are the same configurations used when creating the nodes
|
200
|
+
in the Vagabondfile.
|
201
|
+
|
202
|
+
### :definitions
|
203
|
+
|
204
|
+
These are the definitions of your nodes. Any options here that were defined
|
205
|
+
within the `:defaults` section will be overridden.
|
206
|
+
|
207
|
+
### :clusters
|
208
|
+
|
209
|
+
These are the clusters of nodes that describe the infrastructure. The key
|
210
|
+
provides the identifier name used from the `spec` command. The `:overrides`
|
211
|
+
are cluster specific overrides that are applied to all nodes when created.
|
212
|
+
The `:nodes` is an array of `:definitions` keys for nodes to build. The
|
213
|
+
keys can be repeated `n` times to provide multiple nodes of a specific type.
|
214
|
+
|
215
|
+
### Usage
|
216
|
+
|
217
|
+
```
|
218
|
+
$ vagabond spec my_cluster
|
219
|
+
```
|
220
|
+
|
221
|
+
### Applying specs
|
222
|
+
|
223
|
+
Specs are applied based on the run list describing the node. After the local
|
224
|
+
chef server has been created (if required), all nodes have been created, and
|
225
|
+
all nodes provisioned vagabond will run back through all nodes applying the
|
226
|
+
applicable specs. Specs are very straight forward and only use SSH connections
|
227
|
+
to spec the node. An example spec:
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
require 'spec_helper'
|
231
|
+
|
232
|
+
describe 'cron' do
|
233
|
+
it{ should be_enabled }
|
234
|
+
it{ should be_running }
|
235
|
+
end
|
236
|
+
```
|
237
|
+
|
238
|
+
### Spec real infrastructure
|
239
|
+
|
240
|
+
Since specs only require an SSH connection to test nodes, we can run specs
|
241
|
+
against actual live infrastructure to see if it is currently in a valid
|
242
|
+
state based on existing specs. Awesome!
|
243
|
+
|
244
|
+
```
|
245
|
+
$ vagabond spec my_cluster --environment production
|
246
|
+
```
|
247
|
+
|
134
248
|
## Important note
|
135
249
|
|
136
250
|
Until namespaces hit Linux proper, vagabond `sudo`s its way around. You
|
@@ -163,6 +277,13 @@ get help making things better!
|
|
163
277
|
* Base updates and pull requests on the `develop` branch
|
164
278
|
* Please don't update core files like `version.rb` or `vagabond.gemspec`
|
165
279
|
|
280
|
+
## Contributors
|
281
|
+
|
282
|
+
* [Bryan Berry](https://github.com/bryanwb)
|
283
|
+
* [Jesse Nelson](https://github.com/spheromak)
|
284
|
+
* [Sean Escriva](https://github.com/webframp)
|
285
|
+
* [Xabier de Zuazo](https://github.com/zuazo)
|
286
|
+
|
166
287
|
## Infos
|
167
288
|
|
168
|
-
* Repository: https://github.com/chrisroberts/vagabond
|
289
|
+
* Repository: https://github.com/chrisroberts/vagabond
|
data/bin/vagabond
CHANGED
@@ -4,25 +4,52 @@ Signal.trap('INT'){ exit 255 }
|
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
6
|
require 'vagabond'
|
7
|
+
require 'vagabond/errors'
|
7
8
|
|
8
9
|
if(ARGV.include?('--version') || ARGV.include?('-v'))
|
9
10
|
require 'vagabond/vagabond'
|
10
11
|
Vagabond::Vagabond.new.send(:version)
|
12
|
+
elsif(%w(help --help -h).include?(ARGV.first))
|
13
|
+
puts "-- Vagabond --\n"
|
14
|
+
require 'vagabond/vagabond'
|
15
|
+
Object.send(:remove_const, :ARGV)
|
16
|
+
ARGV = %w(help)
|
17
|
+
Vagabond::Vagabond.start
|
18
|
+
%w(server knife kitchen spec).each do |key|
|
19
|
+
puts "-- #{key.capitalize} --\n"
|
20
|
+
require "vagabond/#{key}"
|
21
|
+
Object.send(:remove_const, :ARGV)
|
22
|
+
ARGV = %w(help)
|
23
|
+
Vagabond.const_get(key.capitalize).start
|
24
|
+
end
|
11
25
|
else
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
begin
|
27
|
+
case arg = ARGV.shift
|
28
|
+
when 'server'
|
29
|
+
require 'vagabond/server'
|
30
|
+
Vagabond::Server
|
31
|
+
when 'knife'
|
32
|
+
require 'vagabond/knife'
|
33
|
+
ARGV.unshift(arg) unless ARGV.empty?
|
34
|
+
Vagabond::Knife
|
35
|
+
when 'test', 'kitchen'
|
36
|
+
require 'vagabond/kitchen'
|
37
|
+
Vagabond::Kitchen
|
38
|
+
when 'spec'
|
39
|
+
require 'vagabond/spec'
|
40
|
+
Vagabond::Spec
|
41
|
+
else
|
42
|
+
require 'vagabond/vagabond'
|
43
|
+
ARGV.unshift(arg)
|
44
|
+
Vagabond::Vagabond
|
45
|
+
end.start
|
46
|
+
rescue Vagabond::VagabondError => e
|
47
|
+
exit e.exit_code
|
48
|
+
rescue Exception => e
|
49
|
+
$stderr.puts "Vagabond exiting. Reason: #{e}"
|
50
|
+
if(ENV['VAGABOND_EXIT_DEBUG'])
|
51
|
+
puts "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
|
52
|
+
end
|
53
|
+
exit -1
|
54
|
+
end
|
28
55
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Vagabond
|
2
|
+
module Actions
|
3
|
+
module Cluster
|
4
|
+
class << self
|
5
|
+
def included(klass)
|
6
|
+
klass.class_eval do
|
7
|
+
class << self
|
8
|
+
def _cluster_options
|
9
|
+
[[
|
10
|
+
:auto_provision, :type => :boolean,
|
11
|
+
:desc => 'Automatically provision nodes', :default => true
|
12
|
+
],
|
13
|
+
[
|
14
|
+
:delay, :type => :numeric, :default => 0,
|
15
|
+
:desc => 'Add delay between provisions (helpful for indexing)'
|
16
|
+
],
|
17
|
+
[
|
18
|
+
:parallel, :type => :boolean, :default => false,
|
19
|
+
:desc => 'Build nodes in parallel'
|
20
|
+
]
|
21
|
+
]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def _cluster
|
29
|
+
clr = vagabondfile[:clusters][name] if vagabondfile[:clusters]
|
30
|
+
if(clr)
|
31
|
+
ui.info "#{ui.color('Vagabond:', :bold)} Building cluster - #{ui.color(name, :green)}"
|
32
|
+
if(vagabondfile[:local_chef_server] && vagabondfile[:local_chef_server][:enabled])
|
33
|
+
require 'vagabond/server'
|
34
|
+
srv = ::Vagabond::Server.new
|
35
|
+
srv.send(:setup, 'up')
|
36
|
+
srv.execute
|
37
|
+
# Reload so we get proper values
|
38
|
+
load_configurations
|
39
|
+
end
|
40
|
+
cluster_instances = clr.map do |n|
|
41
|
+
ui.info "Building #{n} for cluster!"
|
42
|
+
v_inst = Vagabond.new
|
43
|
+
v_inst.options = options.dup
|
44
|
+
v_inst.send(:setup, 'up', n, :ui => ui)
|
45
|
+
v_inst.execute
|
46
|
+
if(options[:delay].to_i > 0 && n != clr.last)
|
47
|
+
ui.warn "Delay requested between node processing. Sleeping for #{options[:delay].to_i} seconds."
|
48
|
+
sleep(options[:delay].to_i)
|
49
|
+
end
|
50
|
+
v_inst
|
51
|
+
end
|
52
|
+
if(options[:parallel])
|
53
|
+
ui.info "Waiting for parallel completes!"
|
54
|
+
cluster_instances.map do |inst|
|
55
|
+
inst.wait_for_completion
|
56
|
+
end
|
57
|
+
end
|
58
|
+
ui.info " -> #{ui.color("Built cluster #{name}", :green)}"
|
59
|
+
else
|
60
|
+
ui.error "Cluster name provided does not exist: #{name}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'elecksee/ephemeral'
|
2
|
+
|
1
3
|
module Vagabond
|
2
4
|
module Actions
|
3
5
|
module Create
|
@@ -21,14 +23,17 @@ module Vagabond
|
|
21
23
|
tmpl = internal_config[:template_mappings][tmpl]
|
22
24
|
elsif(!BASE_TEMPLATES.include?(tmpl))
|
23
25
|
ui.fatal "Template requested for node does not exist: #{tmpl}"
|
24
|
-
|
26
|
+
raise VagabondError::InvalidTemplate.new(tmpl)
|
27
|
+
end
|
28
|
+
unless(config[:device])
|
29
|
+
config[:directory] = true
|
25
30
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
e_name =
|
31
|
+
config[:daemon] = true
|
32
|
+
config[:original] = tmpl
|
33
|
+
config[:bind] = File.expand_path(File.dirname(vagabondfile.store_path))
|
34
|
+
ephemeral = Lxc::Ephemeral.new(config)
|
35
|
+
ephemeral.start!(:fork)
|
36
|
+
e_name = ephemeral.name
|
32
37
|
@internal_config[mappings_key][name] = e_name
|
33
38
|
@internal_config.save
|
34
39
|
@lxc = Lxc.new(e_name)
|
@@ -2,27 +2,76 @@ module Vagabond
|
|
2
2
|
module Actions
|
3
3
|
module Destroy
|
4
4
|
|
5
|
+
class << self
|
6
|
+
def included(klass)
|
7
|
+
klass.class_eval do
|
8
|
+
class << self
|
9
|
+
def _cluster_options
|
10
|
+
[
|
11
|
+
[
|
12
|
+
:cluster, :type => :boolean,
|
13
|
+
:desc => 'Destroy cluster of nodes with provided name', :default => false
|
14
|
+
]
|
15
|
+
]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
5
23
|
def _destroy
|
6
24
|
name_required!
|
7
|
-
if(
|
8
|
-
|
9
|
-
|
10
|
-
|
25
|
+
if(options[:cluster])
|
26
|
+
nodes = vagabondfile[:clusters][name] if vagabondfile[:clusters]
|
27
|
+
if(nodes)
|
28
|
+
ui.info "#{ui.color('Vagabond:', :bold)} Destroying cluster - #{ui.color(name, :red)}"
|
29
|
+
else
|
30
|
+
ui.error "Cluster name provided does not exist: #{name}"
|
31
|
+
nodes = []
|
32
|
+
end
|
11
33
|
else
|
12
|
-
|
34
|
+
nodes = [name, @leftover_args].flatten.compact
|
35
|
+
end
|
36
|
+
nodes.each do |n|
|
37
|
+
next unless n.is_a?(String)
|
38
|
+
@name = n
|
39
|
+
load_configurations
|
40
|
+
if(lxc.exists?)
|
41
|
+
ui.info "#{ui.color('Vagabond:', :bold)} Destroying node: #{ui.color(name, :red)}"
|
42
|
+
do_destroy
|
43
|
+
ui.info ui.color(' -> DESTROYED', :red)
|
44
|
+
else
|
45
|
+
ui.error "Node not created: #{name}"
|
46
|
+
end
|
13
47
|
end
|
14
48
|
end
|
15
49
|
|
16
50
|
private
|
17
51
|
|
18
52
|
def do_destroy
|
19
|
-
lxc.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
if(
|
53
|
+
lxc.shutdown if lxc.running?
|
54
|
+
ui.info 'Waiting for graceful shutdown and cleanup...'
|
55
|
+
5.times do
|
56
|
+
break unless lxc.exists?
|
57
|
+
sleep(1)
|
58
|
+
end
|
59
|
+
if(lxc.exists?)
|
60
|
+
com = "#{options[:sudo]}lxc-destroy -n #{lxc.name}"
|
61
|
+
debug(com)
|
62
|
+
cmd = Mixlib::ShellOut.new(com, :live_stream => options[:debug])
|
63
|
+
cmd.run_command
|
64
|
+
force_umount_if_required!
|
65
|
+
end
|
66
|
+
internal_config[mappings_key].delete(name)
|
67
|
+
internal_config.save
|
68
|
+
end
|
69
|
+
|
70
|
+
def force_umount_if_required!
|
71
|
+
mount = %x{mount}.split("\n").find_all do |line|
|
72
|
+
line.include?(lxc.name)
|
73
|
+
end
|
74
|
+
unless(mount.empty?)
|
26
75
|
ui.info ui.color(' -> Failed to unmount some resources. Forcing manually.', :yellow)
|
27
76
|
%w(rootfs ephemeralbind).each do |mnt|
|
28
77
|
com = "#{options[:sudo]}umount /var/lib/lxc/#{lxc.name}/#{mnt}"
|
@@ -33,10 +82,15 @@ module Vagabond
|
|
33
82
|
debug(com)
|
34
83
|
cmd = Mixlib::ShellOut.new(com, :live_stream => options[:debug])
|
35
84
|
cmd.run_command
|
36
|
-
cmd.error!
|
37
|
-
internal_config[mappings_key].delete(name)
|
38
85
|
end
|
39
|
-
|
86
|
+
# check for tmpfs and umount too
|
87
|
+
tmp = mount.detect{|x|x.include?('rootfs')}.scan(%r{upperdir=[^,]+}).first.to_s.split('=').last
|
88
|
+
if(tmp)
|
89
|
+
com = "#{options[:sudo]}umount #{tmp}"
|
90
|
+
debug(com)
|
91
|
+
cmd = Mixlib::ShellOut.new(com, :live_stream => options[:debug])
|
92
|
+
cmd.run_command
|
93
|
+
end
|
40
94
|
end
|
41
95
|
end
|
42
96
|
end
|