dply 0.2.19 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +4 -0
  3. data/Rakefile +0 -14
  4. data/TODO +0 -1
  5. data/code_dump/old_remote_task.rb +2 -0
  6. data/{dev_bin → dev_exe}/dplyr +0 -0
  7. data/{dev_bin → dev_exe}/drake +1 -1
  8. data/dply.gemspec +2 -2
  9. data/{bin → exe}/dplyr +0 -0
  10. data/{bin → exe}/drake +12 -14
  11. data/lib/dply/TEST_TODO +50 -0
  12. data/lib/dply/app_config.rb +108 -0
  13. data/lib/dply/base_config.rb +110 -0
  14. data/lib/dply/build.rb +17 -11
  15. data/lib/dply/build_config.rb +28 -96
  16. data/lib/dply/bundle.rb +7 -30
  17. data/lib/dply/cli/build.rb +5 -12
  18. data/lib/dply/cli/ctl.rb +7 -8
  19. data/lib/dply/cli/deploy.rb +6 -10
  20. data/lib/dply/cli/devbuild.rb +6 -10
  21. data/lib/dply/cli/install_pkgs.rb +2 -3
  22. data/lib/dply/cli/run.rb +27 -0
  23. data/lib/dply/cli/status.rb +1 -2
  24. data/lib/dply/cli/task.rb +6 -12
  25. data/lib/dply/code_archive.rb +123 -0
  26. data/lib/dply/command.rb +57 -0
  27. data/lib/dply/config_downloader.rb +3 -2
  28. data/lib/dply/curl.rb +1 -5
  29. data/lib/dply/custom_logger.rb +18 -1
  30. data/lib/dply/deplist.rb +16 -48
  31. data/lib/dply/deploy_config.rb +34 -0
  32. data/lib/dply/elf.rb +60 -0
  33. data/lib/dply/env.rb +9 -0
  34. data/lib/dply/git.rb +15 -8
  35. data/lib/dply/helper.rb +21 -33
  36. data/lib/dply/linker.rb +27 -27
  37. data/lib/dply/lock.rb +2 -9
  38. data/lib/dply/logger.rb +1 -1
  39. data/lib/dply/pkgs.rb +9 -11
  40. data/lib/dply/release.rb +2 -2
  41. data/lib/dply/{archive.rb → remote_archive.rb} +1 -1
  42. data/lib/dply/repo.rb +3 -3
  43. data/lib/dply/rpm.rb +12 -20
  44. data/lib/dply/scripts/depcheck.rb +4 -0
  45. data/lib/dply/shared_dirs.rb +1 -1
  46. data/lib/dply/strategy/archive.rb +15 -22
  47. data/lib/dply/strategy/base.rb +82 -0
  48. data/lib/dply/strategy/git.rb +18 -19
  49. data/lib/dply/task_dsl.rb +101 -0
  50. data/lib/dply/util.rb +75 -0
  51. data/lib/dply/venv.rb +53 -0
  52. data/lib/dply/version.rb +1 -1
  53. data/lib/dply/yum.rb +21 -31
  54. data/lib/dplyr/consul.rb +1 -1
  55. data/spec/dply/base_config_spec.rb +178 -0
  56. data/spec/dply/bundle_spec.rb +100 -0
  57. data/spec/dply/command_spec.rb +190 -0
  58. data/spec/dply/curl_spec.rb +41 -0
  59. data/spec/dply/deplist_spec.rb +48 -0
  60. data/spec/dply/elf_spec.rb +64 -0
  61. data/spec/dply/env_spec.rb +57 -0
  62. data/spec/dply/git_spec.rb +136 -0
  63. data/spec/dply/helper_spec.rb +168 -0
  64. data/spec/dply/linker_spec.rb +81 -0
  65. data/spec/dply/lock_spec.rb +24 -0
  66. data/spec/dply/pkgs_spec.rb +105 -0
  67. data/spec/dply/repo_spec.rb +58 -0
  68. data/spec/dply/rpm_spec.rb +32 -0
  69. data/spec/dply/yum_spec.rb +29 -0
  70. data/spec/integration/archive_flow_spec.rb +87 -0
  71. data/spec/integration/git_flow_spec.rb +63 -0
  72. data/spec/repo.rb +27 -0
  73. data/spec/spec_helper.rb +44 -0
  74. data/spec/test_data/build.tar.gz +0 -0
  75. data/spec/test_data/build.tar.gz.md5 +1 -0
  76. data/spec/test_data/bundle/gems_installed/Gemfile +1 -0
  77. data/spec/test_data/bundle/gems_not_installed/Gemfile +2 -0
  78. data/spec/test_data/bundle/no_gemfile/.gitkeep +0 -0
  79. data/spec/test_data/command/test.rb +7 -0
  80. data/spec/test_data/elf/elf +0 -0
  81. data/spec/test_data/elf/libpgtypes.so.3 +0 -0
  82. data/spec/test_data/elf/not_elf +1 -0
  83. data/spec/test_data/sample_repo/.dply.lock +0 -0
  84. data/spec/test_data/sample_repo/Gemfile +2 -0
  85. data/spec/test_data/sample_repo/Rakefile +3 -0
  86. data/spec/test_data/sample_repo/app.rb +1 -0
  87. data/spec/test_data/sample_repo/dply/app.rb +33 -0
  88. data/spec/test_data/sample_repo/lib/libacl.so.1 +0 -0
  89. data/spec/test_data/sample_repo/pkgs.yml +2 -0
  90. data/spec/webserver.rb +21 -0
  91. metadata +96 -28
  92. data/lib/dply/cli/app_task.rb +0 -38
  93. data/lib/dply/config.rb +0 -120
  94. data/lib/dply/config_struct.rb +0 -52
  95. data/lib/dply/rakelib/drake.rake +0 -33
  96. data/lib/dply/tasks.rb +0 -136
@@ -0,0 +1,81 @@
1
+ require 'dply/linker'
2
+ require 'pathname'
3
+
4
+ module Dply
5
+ describe Linker do
6
+
7
+ before :all do
8
+ FileUtils.rm_rf "tmp/linker"
9
+ FileUtils.mkdir_p "tmp/linker"
10
+ end
11
+
12
+ def new_work_dir
13
+ d = Dir.mktmpdir nil, "tmp/linker"
14
+ Dir.chdir d do
15
+ FileUtils.mkdir ["src", "src/dir1", "src/dir2", "dest", "dest/config"]
16
+ FileUtils.touch ["src/file1", "src/file2"]
17
+ end
18
+ "#{Dir.pwd}/#{d}"
19
+ end
20
+
21
+ def linker(map:, work_dir:)
22
+ src = "#{work_dir}/src"
23
+ dest = "#{work_dir}/dest"
24
+ Linker.new src, dest, map: map
25
+ end
26
+
27
+ let(:map) do
28
+ {
29
+ "config/1" => "file1",
30
+ "file2" => "file2",
31
+ "tmp" => "dir1",
32
+ "log" => "dir2"
33
+ }
34
+ end
35
+
36
+ describe ".new" do
37
+ it "doesn't accept relative path for src_dir" do
38
+ expect { Linker.new("tmp", "/tmp", map: {}) }.to raise_error(Dply::Error)
39
+ end
40
+
41
+ it "doesn't accept relative path for dest_dir" do
42
+ expect { Linker.new("/tmp", "tmp", map: {}) }.to raise_error(Dply::Error)
43
+ end
44
+
45
+ it "doesn't accept relative paths in map" do
46
+ expect { Linker.new("/tmp", "/tmp/1", map: {"/a" => "b"}) }.to raise_error(Dply::Error)
47
+ expect { Linker.new("/tmp", "/tmp/1", map: {"a" => "/b"}) }.to raise_error(Dply::Error)
48
+ end
49
+ end
50
+
51
+ describe "#create_symlinks" do
52
+
53
+ it "creates expected symlinks" do
54
+ work_dir = new_work_dir
55
+ linker = linker(map: map, work_dir: work_dir)
56
+ linker.create_symlinks
57
+ map.each do |k, v|
58
+ dpath = Pathname.new("#{work_dir}/dest/#{k}").realpath
59
+ spath = Pathname.new("#{work_dir}/src/#{v}")
60
+ expect(dpath).to eq(spath)
61
+ end
62
+ end
63
+
64
+ it "errors out if link target already exists" do
65
+ work_dir = new_work_dir
66
+ FileUtils.touch "#{work_dir}/dest/tmp"
67
+ linker = linker(map: map, work_dir: work_dir)
68
+ expect { linker.create_symlinks }.to raise_error(Dply::Error)
69
+ end
70
+
71
+ it "errors out if link source doesn't exist" do
72
+ work_dir = new_work_dir
73
+ FileUtils.touch "#{work_dir}/dest/tmp"
74
+ map = { "log" => "non_existent" }
75
+ linker = linker(map: map, work_dir: work_dir)
76
+ expect { linker.create_symlinks }.to raise_error(Dply::Error)
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,24 @@
1
+ require 'dply/lock'
2
+
3
+ module Dply
4
+ describe Lock do
5
+ describe "#acquire" do
6
+ it "acquires an exclusive lock(flock) on the given dir" do
7
+ lock = Lock.new("tmp")
8
+ lock.acquire
9
+ other_lock = Lock.new("tmp")
10
+ expect { other_lock.acquire }.to raise_error(Error, /exclusive lock/)
11
+ end
12
+
13
+ specify "lock survives GC" do
14
+ GC.start(full_mark: true, immediate_sweep: true)
15
+ lock = Lock.new("tmp")
16
+ lock.acquire
17
+
18
+ GC.start(full_mark: true, immediate_sweep: true)
19
+ other_lock = Lock.new("tmp")
20
+ expect { other_lock.acquire }.to raise_error(Error, /exclusive lock/)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,105 @@
1
+ require 'dply/pkgs'
2
+
3
+ module Dply
4
+ describe Pkgs do
5
+
6
+ before :all do
7
+ FileUtils.rm_rf "tmp/pkgs"
8
+ FileUtils.mkdir_p "tmp/pkgs"
9
+ end
10
+
11
+ def build_yml(file, data)
12
+ case data
13
+ when Hash
14
+ File.write file, YAML.dump(data)
15
+ else
16
+ File.write file, data
17
+ end
18
+ end
19
+
20
+ def pkgs_yml(data, &block)
21
+ d = Dir.mktmpdir nil, "tmp/pkgs"
22
+ file = "p.yml"
23
+ Dir.chdir(d) do
24
+ build_yml file, data
25
+ yield file
26
+ end
27
+ end
28
+
29
+ def new_data
30
+ {"build_pkgs" => ["b1"], "pkgs" => ["p1", "p2"]}
31
+ end
32
+
33
+ INVALID_PKG_NAMES = [
34
+ "a1.rpm",
35
+ "a1*.pm",
36
+ "http://a.co/rpm",
37
+ "/a/b"
38
+ ]
39
+
40
+ describe ".new" do
41
+ it "reads pkg lists from given pkgs_yml to all/build/runtime" do
42
+ pkgs_yml(new_data) do |f|
43
+ pkgs = Pkgs.new f
44
+ expect(pkgs.build).to eq(["b1"])
45
+ expect(pkgs.runtime).to eq(["p1", "p2"])
46
+ expect(pkgs.all.sort).to eq(["b1", "p1", "p2"])
47
+ end
48
+ end
49
+
50
+ INVALID_PKG_NAMES.each do |i|
51
+ it "raises error for pkg name #{i}" do
52
+ d1 = new_data
53
+ d1["build_pkgs"] << i
54
+ pkgs_yml(d1) do |f|
55
+ expect { Pkgs.new f}.to raise_error(Error)
56
+ end
57
+
58
+ d2 = new_data
59
+ d2["pkgs"] << i
60
+ pkgs_yml(d2) do |f|
61
+ expect { Pkgs.new f}.to raise_error(Error)
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ subject(:pkgs) { pkgs_yml(new_data) { |f| Pkgs.new f } }
68
+
69
+ describe "#install" do
70
+ context "when build_mode: true" do
71
+ it "installs all the packages" do
72
+ expect(Yum).to receive(:install).with(pkgs.all)
73
+ expect(pkgs.all.size).to eq(3)
74
+ pkgs.install build_mode: true
75
+ end
76
+ end
77
+
78
+ context "when build_mode: false" do
79
+ it "installs only the runtime packages" do
80
+ expect(Yum).to receive(:install).with(pkgs.runtime)
81
+ expect(pkgs.runtime.size).to eq(2)
82
+ pkgs.install build_mode: false
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#installed?" do
88
+ context "when build_mode: true" do
89
+ it "returns install status" do
90
+ expect(Yum).to receive(:installed?).with(pkgs.all).and_return(:status)
91
+ expect(pkgs.all.size).to eq(3)
92
+ expect(pkgs.installed? build_mode: true).to eq(:status)
93
+ end
94
+ end
95
+
96
+ context "when build_mode: false" do
97
+ it "returns install status" do
98
+ expect(Yum).to receive(:installed?).with(pkgs.runtime).and_return(:status)
99
+ expect(pkgs.runtime.size).to eq(2)
100
+ expect(pkgs.installed? build_mode: false).to eq(:status)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,58 @@
1
+ require 'dply/repo'
2
+ require 'repo'
3
+
4
+ module Dply
5
+ describe Repo do
6
+
7
+ before :all do
8
+ @work_dir = "tmp/repo"
9
+ @source_repo = "#{Dir.pwd}/tmp/repo.git"
10
+ FileUtils.rm_rf @work_dir
11
+ FileUtils.mkdir_p @work_dir
12
+ end
13
+
14
+ def source_repo
15
+ @source_repo
16
+ end
17
+
18
+ def tmp_dir(&block)
19
+ d = Dir.mktmpdir nil, "#{Dir.pwd}/#{@work_dir}"
20
+ Dir.chdir(d) { yield d }
21
+ end
22
+
23
+ subject(:repo) { Repo.new "repo", source_repo, mirror: nil }
24
+
25
+ describe ".create" do
26
+ it "creates the repo from the given upstream" do
27
+ tmp_dir do |d|
28
+ suppress_output { repo.create }
29
+ expect(File).to exist("repo/.git")
30
+ end
31
+ end
32
+
33
+ it "throws an error if a different git repo already exists at [dir]" do
34
+ tmp_dir do |d|
35
+ FileUtils.mkdir "repo"
36
+ Dir.chdir "repo" do
37
+ system! "touch a"
38
+ system! "git init"
39
+ system! "git add a; git commit -m 'commit'"
40
+ system! "git remote add origin /some/other/upstream"
41
+ end
42
+ expect { repo.create }.to raise_error(Error)
43
+ end
44
+ end
45
+
46
+ it "clones repo from a mirror if specified" do
47
+ upstream = "/some/upstream.git"
48
+ repo = Repo.new "repo", upstream, mirror: source_repo
49
+ tmp_dir do
50
+ suppress_output { repo.create }
51
+ Dir.chdir "repo" do
52
+ expect(Git.remote_url).to eq(upstream)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,32 @@
1
+ require 'dply/rpm'
2
+
3
+ module Dply
4
+ describe Rpm do
5
+
6
+ def test_cases
7
+ {
8
+ "libc.so.6" => [ "glibc" ],
9
+ "libacl.so.1" => ["libacl"],
10
+ "libattr.so.1" => ["libattr"]
11
+ }
12
+ end
13
+
14
+ def to_64bit(lib)
15
+ "#{lib}()(64bit)"
16
+ end
17
+
18
+ subject(:rpm) { Rpm }
19
+
20
+ describe ".libs_pkgs_map" do
21
+ it "returns the map of lib => [list of pkgs] which provide that lib" do
22
+ test_cases = test_cases()
23
+ libs = test_cases.keys.map { |i| to_64bit i }
24
+ map = rpm.libs_pkgs_map libs
25
+ test_cases.keys.each do |i|
26
+ lib = to_64bit(i)
27
+ expect(map[lib]).to eq(test_cases[i])
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ require 'dply/yum'
2
+
3
+ module Dply
4
+ describe Yum do
5
+
6
+ describe ".install" do
7
+ it "installs the missing packages" do
8
+ expect(Yum).to receive(:cmd).with(["yum", "install", "-y", "xyz"])
9
+ expect { Yum.install(["glibc", "xyz"]) }.to raise_error(Error)
10
+ end
11
+
12
+ it "doesn't do anything if packages are already installed" do
13
+ expect(Yum).not_to receive(:cmd).with(array_including("yum", "install"))
14
+ Yum.install(["glibc", "bash"])
15
+ end
16
+
17
+ end
18
+
19
+ describe ".installed?" do
20
+ it "returns true if all pkgs are installed" do
21
+ expect(Yum.installed? ["glibc", "bash"]).to eq(true)
22
+ end
23
+
24
+ it "returns false if some pkgs are not installed" do
25
+ expect(Yum.installed? ["glibc", "xyz"]).to eq(false)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,87 @@
1
+ require 'repo'
2
+
3
+ describe "archive flow" do
4
+
5
+ before :all do
6
+ @work_dir = "tmp/archive_flow"
7
+ @repo_dir = "tmp/repo.git"
8
+ @build_dir = "#{@work_dir}/build"
9
+ @deploy_dir = "#{@work_dir}/deploy"
10
+ @drake = "#{Dir.pwd}/dev_exe/drake"
11
+ FileUtils.rm_rf @work_dir
12
+ FileUtils.mkdir_p @work_dir
13
+
14
+ puts "=="* 40
15
+ build_archive
16
+ deploy_archive
17
+ puts "=="* 40
18
+ end
19
+
20
+ def system!(command)
21
+ status = system command
22
+ raise "error in '#{command}'" if not status
23
+ end
24
+
25
+ def build_config
26
+ <<~CONFIG
27
+ repo "#{Dir.pwd}/#{@repo_dir}"
28
+ dir_map({
29
+ "tmp" => "tmp",
30
+ "log" => "log"
31
+ })
32
+ CONFIG
33
+ end
34
+
35
+ def deploy_config
36
+ <<~CONFIG
37
+ name "test"
38
+ repo "http://127.0.0.1:8000/#{@build_dir}/build"
39
+ strategy :archive
40
+ branch "master"
41
+
42
+ build_url do
43
+ "\#{repo}/\#{name}-\#{revision}-\#{branch}.tar.gz"
44
+ end
45
+
46
+ dir_map ({
47
+ "log" => "log",
48
+ "tmp" => "tmp",
49
+ })
50
+ CONFIG
51
+ end
52
+
53
+ def build_archive
54
+ FileUtils.mkdir @build_dir
55
+ File.write "#{@build_dir}/build.rb", build_config
56
+ Dir.chdir @build_dir do
57
+ system! "#{@drake} build -r 0"
58
+ end
59
+ end
60
+
61
+ def deploy_archive
62
+ FileUtils.mkdir @deploy_dir
63
+ IO.write "#{@deploy_dir}/deploy.rb", deploy_config
64
+ Dir.chdir @deploy_dir do
65
+ system! "#{@drake} deploy -r 0"
66
+ end
67
+ end
68
+
69
+ specify "app is deployed" do
70
+ Dir.chdir @deploy_dir do
71
+ expect(File).to exist("current")
72
+ expect(File.directory?("current")).to be(true)
73
+ end
74
+ end
75
+
76
+ specify "bundler installs the gems" do
77
+ Dir.chdir @deploy_dir do
78
+ expect(File).to exist("current/vendor/bundle/ruby")
79
+ end
80
+ end
81
+
82
+ specify "reload works" do
83
+ Dir.chdir @deploy_dir do
84
+ system! "#{@drake} reload"
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,63 @@
1
+ require 'repo'
2
+
3
+ describe "git flow" do
4
+
5
+ before :all do
6
+ @work_dir = "tmp/git_flow"
7
+ @repo_dir = "#{Dir.pwd}/tmp/repo.git"
8
+ @deploy_dir = "#{@work_dir}/deploy"
9
+ @drake = "#{Dir.pwd}/dev_exe/drake"
10
+ FileUtils.rm_rf @work_dir
11
+ FileUtils.mkdir_p @work_dir
12
+
13
+ puts "=="* 40
14
+ deploy_git
15
+ puts "==" * 40
16
+ end
17
+
18
+ def system!(command)
19
+ status = system command
20
+ raise "error in '#{command}'" if not status
21
+ end
22
+
23
+ def deploy_config
24
+ <<~CONFIG
25
+ name "test"
26
+ repo "#{@repo_dir}"
27
+ strategy :git
28
+ branch "master"
29
+
30
+ dir_map ({
31
+ "log" => "log",
32
+ "tmp" => "tmp"
33
+ })
34
+ CONFIG
35
+ end
36
+
37
+ def deploy_git
38
+ FileUtils.mkdir @deploy_dir
39
+ IO.write "#{@deploy_dir}/deploy.rb", deploy_config
40
+ Dir.chdir @deploy_dir do
41
+ system! "#{@drake} deploy"
42
+ end
43
+ end
44
+
45
+ specify "app is deployed" do
46
+ Dir.chdir @deploy_dir do
47
+ expect(File).to exist("current")
48
+ expect(File.directory?("current")).to be(true)
49
+ end
50
+ end
51
+
52
+ specify "bundler installs the gems" do
53
+ Dir.chdir @deploy_dir do
54
+ expect(File).to exist("current/vendor/bundle/ruby")
55
+ end
56
+ end
57
+
58
+ specify "reload works" do
59
+ Dir.chdir @deploy_dir do
60
+ system! "#{@drake} reload"
61
+ end
62
+ end
63
+ end