contained_mr 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a671efb4fb8421ddf841a9eeabb64b5612bf930
4
- data.tar.gz: 304aff98010a52db78225a845406f0cb19bd0651
3
+ metadata.gz: 440ccef564b310bd2bc7752380b7d97861ab2020
4
+ data.tar.gz: 15f09bb85ba6e21447b38b26d0790b09342d3f01
5
5
  SHA512:
6
- metadata.gz: d558c08cce053336b116dda4a270c8d391de24d1b1d7ddecaf4c7761b0cb5ac227dbc7952f268c9b6a1448fd935290510d6e34ff061e09d203b2758fb0b14f0f
7
- data.tar.gz: 388ef7ed32cf7506b732cabe66b8f38b869014f89d2b6916e6fc955133c953d6811cbce86daba9fc037746af68063c3fa96738ff6c8dd5eb5fcd9993fd37e8fd
6
+ metadata.gz: 814c12447b2d338a6781cc81419117b189c19598f9dc942f0f8264dd05dfbd4d4cab297ee029a6efe9808cb5b5366cdb0968c6617ba9165eda169c76f2cc0b24
7
+ data.tar.gz: e4b768cb0013ea3dc9b8f9817481eda342c87d966cb4dfcc206f175a5112826960d1c540e53ceaf1729f401e67c3ffb3dab38857e66ff7acda747f36c1f34c61
data/README.md CHANGED
@@ -33,6 +33,17 @@ be executed in every shell where `contained-mr` is used.
33
33
  eval "$(docker-machine env dev)"
34
34
  ```
35
35
 
36
+ ### Cleanup
37
+
38
+ When tests go wrong, they often leave dead containers and images behind.
39
+ Removing all stopped containers and all unused images is a big stick that works
40
+ quite well in development environments.
41
+
42
+ ```bash
43
+ docker ps --all --quiet --no-trunc | xargs docker rm
44
+ docker images --quiet --no-trunc | xargs docker rmi
45
+ ```
46
+
36
47
 
37
48
  ## Contributing to contained_mr
38
49
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.2
data/contained_mr.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: contained_mr 0.3.1 ruby lib
5
+ # stub: contained_mr 0.3.2 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "contained_mr"
9
- s.version = "0.3.1"
9
+ s.version = "0.3.2"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Victor Costan"]
14
- s.date = "2015-10-09"
14
+ s.date = "2015-10-12"
15
15
  s.description = "Plumbing for running mappers and reducers inside Docker containers"
16
16
  s.email = "victor@costan.us"
17
17
  s.extra_rdoc_files = [
@@ -63,6 +63,7 @@ Gem::Specification.new do |s|
63
63
  "testdata/hello/mapreduced.yml",
64
64
  "testdata/hello/reducer.sh",
65
65
  "testdata/input.hello",
66
+ "testdata/invalid/Dockerfile",
66
67
  "testdata/job.hello"
67
68
  ]
68
69
  s.homepage = "http://github.com/pwnall/contained_mr"
@@ -65,7 +65,8 @@ class ContainedMr::Job
65
65
  end
66
66
 
67
67
  tar_io = mapper_tar_context mapper_input
68
- image = Docker::Image.build_from_tar tar_io, t: mapper_image_tag
68
+ image = Docker::Image.build_from_tar tar_io, t: mapper_image_tag,
69
+ forcerm: 1
69
70
  @mapper_image_id = image.id
70
71
  end
71
72
 
@@ -81,7 +82,8 @@ class ContainedMr::Job
81
82
  end
82
83
 
83
84
  tar_io = reducer_tar_context
84
- image = Docker::Image.build_from_tar tar_io, t: reducer_image_tag
85
+ image = Docker::Image.build_from_tar tar_io, t: reducer_image_tag,
86
+ forcerm: 1
85
87
  @reducer_image_id = image.id
86
88
  end
87
89
 
@@ -77,7 +77,7 @@ class ContainedMr::Template
77
77
  #
78
78
  # @param {IO} tar_io IO implementation that produces the image's .tar file
79
79
  def build_image(tar_io)
80
- image = Docker::Image.build_from_tar tar_io, t: image_tag
80
+ image = Docker::Image.build_from_tar tar_io, t: image_tag, forcerm: 1
81
81
  @image_id = image.id
82
82
  end
83
83
  private :build_image
data/test/helper.rb CHANGED
@@ -33,15 +33,17 @@ require 'contained_mr'
33
33
  class MiniTest::Test
34
34
  end
35
35
 
36
- File.unlink 'testdata/hello.zip' if File.file?('testdata/hello.zip')
37
- Zip::File.open('testdata/hello.zip', Zip::File::CREATE) do |zip|
38
- files = Dir.chdir('testdata/hello') { Dir.glob('**/*') }.sort
39
- files.each do |file|
40
- path = File.join 'testdata/hello', file
41
- if File.directory? path
42
- zip.mkdir file
43
- elsif File.file? path
44
- zip.add file, path
36
+ ['hello', 'invalid'].each do |dir|
37
+ File.unlink "testdata/#{dir}.zip" if File.file?("testdata/#{dir}.zip")
38
+ Zip::File.open("testdata/#{dir}.zip", Zip::File::CREATE) do |zip|
39
+ files = Dir.chdir("testdata/#{dir}") { Dir.glob('**/*') }.sort
40
+ files.each do |file|
41
+ path = File.join "testdata/#{dir}", file
42
+ if File.directory? path
43
+ zip.mkdir file
44
+ elsif File.file? path
45
+ zip.add file, path
46
+ end
45
47
  end
46
48
  end
47
49
  end
data/test/test_job.rb CHANGED
@@ -31,6 +31,20 @@ class TestJob < MiniTest::Test
31
31
  assert_nil @job.reducer_runner, "Reducer started prematurely"
32
32
  end
33
33
 
34
+ def test_build_mapper_image_does_not_leak_containers
35
+ old_containers = Docker::Container.all(all: true)
36
+ @template.stubs(:mapper_dockerfile).returns(
37
+ "FROM contained_mrtests/base.hello\nRUN /bin/false\n")
38
+
39
+ assert_raises Docker::Error::UnexpectedResponseError do
40
+ @job.build_mapper_image File.read('testdata/input.hello')
41
+ end
42
+
43
+ assert_equal nil, @job.mapper_image_id
44
+ containers = Docker::Container.all(all: true)
45
+ assert_equal old_containers.length, containers.length
46
+ end
47
+
34
48
  def test_created_mapper_image_tags
35
49
  @job.build_mapper_image File.read('testdata/input.hello')
36
50
 
@@ -95,6 +109,23 @@ class TestJob < MiniTest::Test
95
109
  'contained_mrtests/reducer.testjob:latest'
96
110
  end
97
111
 
112
+ def test_build_reducer_image_does_not_leak_containers
113
+ @job.build_mapper_image File.read('testdata/input.hello')
114
+ 1.upto(3) { |i| @job.run_mapper i }
115
+
116
+ old_containers = Docker::Container.all(all: true)
117
+ @template.stubs(:reducer_dockerfile).returns(
118
+ "FROM contained_mrtests/base.hello\nRUN /bin/false\n")
119
+
120
+ assert_raises Docker::Error::UnexpectedResponseError do
121
+ @job.build_reducer_image
122
+ end
123
+
124
+ assert_equal nil, @job.reducer_image_id
125
+ containers = Docker::Container.all(all: true)
126
+ assert_equal old_containers.length, containers.length
127
+ end
128
+
98
129
  def test_run_reducer
99
130
  @job.build_mapper_image File.read('testdata/input.hello')
100
131
  1.upto(3) { |i| @job.run_mapper i }
@@ -35,6 +35,19 @@ class TestTemplate < MiniTest::Test
35
35
  end
36
36
  end
37
37
 
38
+ def test_invalid_template_does_not_leave_containers_behind
39
+ old_containers = Docker::Container.all(all: true)
40
+
41
+ assert_raises Docker::Error::UnexpectedResponseError do
42
+ template = ContainedMr.new_template 'contained_mrtests', 'invalid',
43
+ StringIO.new(File.binread('testdata/invalid.zip'))
44
+ template.destroy
45
+ end
46
+
47
+ containers = Docker::Container.all(all: true)
48
+ assert_equal old_containers.length, containers.length
49
+ end
50
+
38
51
  def test_destory_with_two_templates
39
52
  template2 = ContainedMr.new_template 'contained_mrtests', 'hello2',
40
53
  StringIO.new(File.binread('testdata/hello.zip'))
@@ -0,0 +1,5 @@
1
+ FROM busybox
2
+
3
+ RUN mkdir -p /usr/mrd && chmod 777 /usr/mrd
4
+ COPY . /usr/mrd/
5
+ RUN /bin/false
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contained_mr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Costan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-09 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
@@ -188,6 +188,7 @@ files:
188
188
  - testdata/hello/mapreduced.yml
189
189
  - testdata/hello/reducer.sh
190
190
  - testdata/input.hello
191
+ - testdata/invalid/Dockerfile
191
192
  - testdata/job.hello
192
193
  homepage: http://github.com/pwnall/contained_mr
193
194
  licenses: