ruby_yacht 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +27 -0
  3. data/.gitignore +4 -0
  4. data/.rdoc_options +29 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +1156 -0
  7. data/.travis.yml +4 -0
  8. data/Gemfile +3 -0
  9. data/Gemfile.lock +44 -0
  10. data/LICENSE +8 -0
  11. data/README.md +216 -0
  12. data/doc/CONTRIBUTING.md +12 -0
  13. data/doc/TODO.md +28 -0
  14. data/doc/configuration_sample.rb +87 -0
  15. data/lib/ruby_yacht/dsl/app.rb +59 -0
  16. data/lib/ruby_yacht/dsl/configuration.rb +55 -0
  17. data/lib/ruby_yacht/dsl/database.rb +57 -0
  18. data/lib/ruby_yacht/dsl/dns_server.rb +38 -0
  19. data/lib/ruby_yacht/dsl/dsl.rb +252 -0
  20. data/lib/ruby_yacht/dsl/project.rb +140 -0
  21. data/lib/ruby_yacht/dsl.rb +6 -0
  22. data/lib/ruby_yacht/images/app/Dockerfile.erb +32 -0
  23. data/lib/ruby_yacht/images/app/checkout.rb +7 -0
  24. data/lib/ruby_yacht/images/app/startup.rb +17 -0
  25. data/lib/ruby_yacht/images/app/update_database_config.rb +45 -0
  26. data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +23 -0
  27. data/lib/ruby_yacht/images/app-dependencies/install_gems.rb +12 -0
  28. data/lib/ruby_yacht/images/database/Dockerfile.erb +26 -0
  29. data/lib/ruby_yacht/images/database/load_seeds.rb +42 -0
  30. data/lib/ruby_yacht/images/database/setup.rb +19 -0
  31. data/lib/ruby_yacht/images/database/setup_database.sql.erb +12 -0
  32. data/lib/ruby_yacht/images/deploy/Dockerfile.erb +2 -0
  33. data/lib/ruby_yacht/images/web/Dockerfile.erb +25 -0
  34. data/lib/ruby_yacht/images/web/add_app.rb +12 -0
  35. data/lib/ruby_yacht/images/web/add_project.rb +14 -0
  36. data/lib/ruby_yacht/images/web/app_config.erb +11 -0
  37. data/lib/ruby_yacht/images/web/index.html.erb +10 -0
  38. data/lib/ruby_yacht/images/web/index_config.erb +12 -0
  39. data/lib/ruby_yacht/images/web/setup.rb +22 -0
  40. data/lib/ruby_yacht/runner/build.rb +21 -0
  41. data/lib/ruby_yacht/runner/build_images.rb +82 -0
  42. data/lib/ruby_yacht/runner/checkout.rb +68 -0
  43. data/lib/ruby_yacht/runner/command.rb +161 -0
  44. data/lib/ruby_yacht/runner/help.rb +55 -0
  45. data/lib/ruby_yacht/runner/implode.rb +33 -0
  46. data/lib/ruby_yacht/runner/run_containers.rb +105 -0
  47. data/lib/ruby_yacht/runner/runner.rb +42 -0
  48. data/lib/ruby_yacht/runner/services.rb +79 -0
  49. data/lib/ruby_yacht/runner/shell.rb +66 -0
  50. data/lib/ruby_yacht/runner/update_hosts.rb +72 -0
  51. data/lib/ruby_yacht/runner.rb +18 -0
  52. data/lib/ruby_yacht.rb +6 -0
  53. data/ruby_yacht.gemspec +18 -0
  54. data/spec/docker/Dockerfile +5 -0
  55. data/spec/docker/build.bash +10 -0
  56. data/spec/dsl/app_spec.rb +47 -0
  57. data/spec/dsl/configuration_spec.rb +64 -0
  58. data/spec/dsl/database_spec.rb +75 -0
  59. data/spec/dsl/dns_server_spec.rb +25 -0
  60. data/spec/dsl/dsl_spec.rb +298 -0
  61. data/spec/dsl/project_spec.rb +266 -0
  62. data/spec/fixtures/app-dependencies-dockerfile +25 -0
  63. data/spec/fixtures/database-dockerfile +31 -0
  64. data/spec/fixtures/deploy-dockerfile +2 -0
  65. data/spec/fixtures/mars-dockerfile +32 -0
  66. data/spec/fixtures/multi-project-web-dockerfile +35 -0
  67. data/spec/fixtures/web-dockerfile +27 -0
  68. data/spec/runner/build_images_spec.rb +164 -0
  69. data/spec/runner/build_spec.rb +86 -0
  70. data/spec/runner/checkout_spec.rb +128 -0
  71. data/spec/runner/command_spec.rb +94 -0
  72. data/spec/runner/help_spec.rb +73 -0
  73. data/spec/runner/implode_spec.rb +62 -0
  74. data/spec/runner/run_containers_spec.rb +141 -0
  75. data/spec/runner/runner_spec.rb +117 -0
  76. data/spec/runner/services_spec.rb +135 -0
  77. data/spec/runner/shell_spec.rb +123 -0
  78. data/spec/runner/update_hosts_spec.rb +163 -0
  79. data/spec/spec_helper.rb +10 -0
  80. data/spec/support/docker_stubbing.rb +93 -0
  81. data/spec/support/test_project.rb +56 -0
  82. metadata +193 -0
@@ -0,0 +1,141 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner::RunContainers do
4
+ include DockerCommandSpec
5
+
6
+ describe "command information" do
7
+ specify { expect(described_class.command).to eq 'run_containers' }
8
+ specify { expect(described_class.description).to eq 'Runs containers for all the apps' }
9
+ end
10
+
11
+ describe "run behavior" do
12
+ before do
13
+ allow(subject).to receive(:remove_container)
14
+ end
15
+
16
+ it "runs the containers for all the apps" do
17
+ docker.fail_unexpected_commands!
18
+ docker.expect 'run -d --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
19
+ docker.expect 'run -d --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
20
+ docker.expect 'run -d -p 80:80 --net=apollo --net-alias=apollo-web --name=apollo-web apollo-web'
21
+ subject.run
22
+ end
23
+
24
+ it "tries to remove all the containers" do
25
+ subject.run
26
+ expect(subject).to have_received(:remove_container).with('apollo-mars')
27
+ expect(subject).to have_received(:remove_container).with('apollo-saturn')
28
+ expect(subject).to have_received(:remove_container).with('apollo-web')
29
+ end
30
+
31
+ it "returns true" do
32
+ expect(subject.run).to be_truthy
33
+ end
34
+
35
+ context "with a deploy container" do
36
+ before do
37
+ RubyYacht.configuration.projects.first.create_deploy_container = true
38
+ end
39
+
40
+ it "runs the deploy container" do
41
+ docker.expect 'run -d -it --net=apollo --net-alias=apollo-deploy --name=apollo-deploy apollo-deploy'
42
+ subject.run
43
+ end
44
+
45
+ it "returns true" do
46
+ expect(subject.run).to be_truthy
47
+ end
48
+ end
49
+
50
+ context "with a local database" do
51
+ before do
52
+ RubyYacht.configuration.projects.first.database.host = 'localhost'
53
+ end
54
+
55
+ it "runs the database container" do
56
+ docker.expect 'run -d --net=apollo --net-alias=apollo-database --name=apollo-database apollo-database'
57
+ subject.run
58
+ end
59
+
60
+ it "returns true" do
61
+ expect(subject.run).to be_truthy
62
+ end
63
+ end
64
+
65
+ context "with multiple projects" do
66
+ before do
67
+ RubyYacht.configure_second_test_project
68
+ end
69
+
70
+ it "runs the containers for both projects" do
71
+ docker.fail_unexpected_commands!
72
+ docker.expect 'run -d --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
73
+ docker.expect 'run -d --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
74
+ docker.expect 'run -d --net=apollo --net-alias=jupiter-venus --name=jupiter-venus jupiter-venus'
75
+ docker.expect 'run -d --net=apollo --net-alias=jupiter-saturn --name=jupiter-saturn jupiter-saturn'
76
+ docker.expect 'run -d -p 80:80 --net=apollo --net-alias=apollo-web --name=apollo-web apollo-web'
77
+ subject.run
78
+ end
79
+
80
+ it "returns true" do
81
+ expect(subject.run).to be_truthy
82
+ end
83
+ end
84
+
85
+ context "with DNS server config" do
86
+ before do
87
+ project = RubyYacht.configuration.projects.first
88
+ project.dns_server = RubyYacht::DnsServer.new
89
+ project.dns_server.servers = ['8.10.1.1', '8.10.1.2']
90
+ project.dns_server.search_domains = ['apps.test.com', 'db.test.com']
91
+ end
92
+
93
+ it "gives the DNS information to the docker container" do
94
+ docker.expect 'run -d --dns=8.10.1.1 --dns=8.10.1.2 --dns-search=apps.test.com --dns-search=db.test.com --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
95
+ subject.run
96
+ end
97
+
98
+ it "returns true" do
99
+ expect(subject.run).to be_truthy
100
+ end
101
+ end
102
+
103
+ context "when checking out the code locally" do
104
+ before do
105
+ RubyYacht.configuration.projects.first.check_out_locally = true
106
+ end
107
+
108
+ it "maps the code volume to a local directory" do
109
+ docker.expect 'run -d -v $PWD/../code/mars:/var/code --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
110
+ docker.expect 'run -d -v $PWD/../code/saturn:/var/code --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
111
+ subject.run
112
+ end
113
+
114
+ it "returns true" do
115
+ expect(subject.run).to be_truthy
116
+ end
117
+
118
+ context "when creating a deploy container" do
119
+ before do
120
+ RubyYacht.configuration.projects.first.create_deploy_container = true
121
+ end
122
+ it "maps the code volume to a local directory" do
123
+ docker.expect 'run -d -v $PWD/../code:/var/code -it --net=apollo --net-alias=apollo-deploy --name=apollo-deploy apollo-deploy'
124
+ subject.run
125
+ end
126
+
127
+ it "returns true" do
128
+ expect(subject.run).to be_truthy
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "remove_container" do
135
+ it "sends the command to docker" do
136
+ allow(IO).to receive(:popen)
137
+ subject.remove_container('apollo-mars')
138
+ expect(IO).to have_received(:popen).with('docker rm -f apollo-mars', err: :close)
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner do
4
+ before do
5
+ allow(described_class).to receive(:puts)
6
+ allow(described_class).to receive(:exit)
7
+ end
8
+
9
+ describe "commands" do
10
+ it "contains all the defined commands" do
11
+ commands = ObjectSpace.each_object(Class).select { |klass| klass < RubyYacht::Runner::Command && klass.inspect =~ /^RubyYacht::Runner/ }.uniq
12
+ expect(described_class.commands.sort_by(&:name)).to eq commands.sort_by(&:name)
13
+ end
14
+ end
15
+
16
+ describe "arguments" do
17
+ it "gets the command-line arguments" do
18
+ expect(described_class.arguments).to eq ARGV
19
+ end
20
+ end
21
+
22
+ describe "run" do
23
+ let(:command) { RubyYacht::Runner::Checkout.new }
24
+ before do
25
+ allow(described_class).to receive(:arguments).and_return %w(checkout -p apollo mars issue1234)
26
+ allow(command).to receive(:run)
27
+ allow(RubyYacht::Runner::Checkout).to receive(:new).and_return(command)
28
+ RubyYacht.configure_test_project
29
+ end
30
+
31
+ context "with a valid command" do
32
+ context "with a successful command" do
33
+ before do
34
+ allow(command).to receive(:run).and_return(true)
35
+ described_class.run
36
+ end
37
+
38
+ it "calls the command" do
39
+ expect(command.project_name).to eq :apollo
40
+ expect(command.app).to eq 'mars'
41
+ expect(command.branch).to eq 'issue1234'
42
+ expect(command).to have_received(:run)
43
+ end
44
+
45
+ it "does not exit" do
46
+ expect(described_class).not_to have_received(:exit)
47
+ end
48
+ end
49
+
50
+ context "with a failed command" do
51
+ before do
52
+ allow(command).to receive(:run).and_return(false)
53
+ described_class.run
54
+ end
55
+
56
+ it "calls the command" do
57
+ expect(command).to have_received(:run)
58
+ end
59
+
60
+ it "exits with a failure code" do
61
+ expect(described_class).to have_received(:exit).with(1)
62
+ end
63
+ end
64
+ end
65
+
66
+ context "with a nil command" do
67
+ before do
68
+ allow(described_class).to receive(:arguments).and_return []
69
+ described_class.run
70
+ end
71
+
72
+ it "logs a message" do
73
+ invocation = $0
74
+ expect(described_class).to have_received(:puts).with("You must provide a command to run")
75
+ expect(described_class).to have_received(:puts).with("Run `#{invocation} help` for more information")
76
+ end
77
+
78
+ it "exits with a failure code" do
79
+ expect(described_class).to have_received(:exit).with(1)
80
+ end
81
+ end
82
+
83
+ context "with a blank command" do
84
+ before do
85
+ allow(described_class).to receive(:arguments).and_return ['']
86
+ described_class.run
87
+ end
88
+
89
+ it "logs a message" do
90
+ invocation = $0
91
+ expect(described_class).to have_received(:puts).with("You must provide a command to run")
92
+ expect(described_class).to have_received(:puts).with("Run `#{invocation} help` for more information")
93
+ end
94
+
95
+ it "exits with a failure code" do
96
+ expect(described_class).to have_received(:exit).with(1)
97
+ end
98
+ end
99
+
100
+ context "with an invalid command" do
101
+ before do
102
+ allow(described_class).to receive(:arguments).and_return %w(foo bar)
103
+ described_class.run
104
+ end
105
+
106
+ it "logs a message" do
107
+ invocation = $0
108
+ expect(described_class).to have_received(:puts).with("Command not recognized: foo")
109
+ expect(described_class).to have_received(:puts).with("Run `#{invocation} help` for more information")
110
+ end
111
+
112
+ it "exits with a failure code" do
113
+ expect(described_class).to have_received(:exit).with(1)
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner::Services do
4
+ include DockerCommandSpec
5
+
6
+ describe "command information" do
7
+ specify { expect(described_class.command).to eq 'services' }
8
+ specify { expect(described_class.description).to eq 'Start, stop, or restart containers' }
9
+
10
+ it "has a banner with more information about the command" do
11
+ usage = "Usage: rspec services [COMMAND]"
12
+ usage += "\n\nStart, stop, or restart containers"
13
+ usage += "\n\n[COMMAND] is required, and can be start, stop, or restart"
14
+ expect(subject.option_parser.banner).to eq usage
15
+ end
16
+
17
+ it "gets the command from position arguments" do
18
+ subject.parse_positional_arguments(["restart", "foo"])
19
+ expect(subject.command).to eq 'restart'
20
+ end
21
+ end
22
+
23
+ describe "run behavior" do
24
+ before do
25
+ subject.command = 'stop'
26
+ end
27
+
28
+ it "sends the command to each container" do
29
+ docker.fail_unexpected_commands!
30
+ docker.expect 'stop apollo-mars'
31
+ docker.expect 'stop apollo-saturn'
32
+ docker.expect 'stop apollo-web'
33
+ subject.run
34
+ end
35
+
36
+ it "returns true" do
37
+ expect(subject.run).to be_truthy
38
+ end
39
+
40
+ context "with a local database" do
41
+ before do
42
+ RubyYacht.configuration.projects.first.database.host = 'localhost'
43
+ end
44
+
45
+ it "stops the database" do
46
+ docker.expect 'stop apollo-database'
47
+ subject.run
48
+ end
49
+
50
+ it "returns true" do
51
+ expect(subject.run).to be_truthy
52
+ end
53
+ end
54
+
55
+ context "with a docker machine" do
56
+ before do
57
+ allow(subject).to receive(:backtick).with('which docker-machine').and_return '/usr/bin/docker-machine'
58
+ allow(subject).to receive(:backtick).with('docker-machine env default').and_return "# Test\nexport TEST_VAL=\"123\""
59
+ ENV.delete('TEST_VAL')
60
+ end
61
+
62
+ after do
63
+ ENV.delete('TEST_VAL')
64
+ end
65
+
66
+ context "with the start command" do
67
+ before do
68
+ subject.command = 'start'
69
+ end
70
+
71
+ it "starts the docker machine" do
72
+ subject.run
73
+ expect(@system_commands).to eq ['docker-machine start default']
74
+ expect(ENV['TEST_VAL']).to eq '123'
75
+ end
76
+
77
+ it "returns true" do
78
+ expect(subject.run).to be_truthy
79
+ end
80
+ end
81
+
82
+ context "with the stop command" do
83
+ before do
84
+ subject.command = 'stop'
85
+ end
86
+
87
+ it "does not send a message to docker machine" do
88
+ subject.run
89
+ expect(@system_commands).to eq []
90
+ expect(ENV['TEST_VAL']).to be_nil
91
+ end
92
+
93
+ it "returns true" do
94
+ expect(subject.run).to be_truthy
95
+ end
96
+ end
97
+ end
98
+
99
+ context "with no command" do
100
+ before do
101
+ subject.command = nil
102
+ end
103
+
104
+ it "logs error messages" do
105
+ subject.run
106
+ expect(@log_entries).to eq [
107
+ "You must provide a command",
108
+ "Run rspec help services for more information"
109
+ ]
110
+ end
111
+
112
+ it "returns false" do
113
+ expect(subject.run).to be_falsey
114
+ end
115
+ end
116
+
117
+ context "with an invalid command" do
118
+ before do
119
+ subject.command = 'foo'
120
+ end
121
+
122
+ it "logs error messages" do
123
+ subject.run
124
+ expect(@log_entries).to eq [
125
+ "foo is not a valid docker command",
126
+ "Run rspec help services for more information"
127
+ ]
128
+ end
129
+
130
+ it "returns false" do
131
+ expect(subject.run).to be_falsey
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner::Shell do
4
+ include DockerCommandSpec
5
+
6
+ describe "command information" do
7
+ specify { expect(described_class.command).to eq 'shell' }
8
+ specify { expect(described_class.description).to eq 'Open a shell in a container' }
9
+
10
+ describe "option parser" do
11
+ it "has the usage banner" do
12
+ expect(subject.option_parser.banner).to eq "Usage: rspec shell [options] [APP] [command]"
13
+ end
14
+
15
+ it "has the usage summary" do
16
+ usage = ["\n"]
17
+ usage << "The command is optional. If you omit it, this will open a bash shell\n"
18
+ usage << "\n"
19
+ usage << "Options:\n"
20
+ usage << " -p, --project PROJECT The project with the app we are opening the sell in. Default: apollo\n"
21
+ expect(subject.option_parser.summarize).to eq usage
22
+ end
23
+
24
+ it "takes the project from the command line" do
25
+ arguments = ["-p", "jupiter", "venus"]
26
+ subject.option_parser.parse!(arguments)
27
+ expect(subject.project_name).to eq :jupiter
28
+ expect(arguments).to eq ["venus"]
29
+ end
30
+ end
31
+
32
+ describe "parse_positional_arguments" do
33
+ it "takes the app from the command line" do
34
+ subject.parse_positional_arguments(["venus", "rails", "c"])
35
+ expect(subject.app).to eq "venus"
36
+ end
37
+
38
+ it "takes the command from the command line" do
39
+ subject.parse_positional_arguments(["venus", "rails", "c"])
40
+ expect(subject.command).to eq "rails c"
41
+ end
42
+
43
+ it "defaults the command to bash" do
44
+ subject.parse_positional_arguments(["venus"])
45
+ expect(subject.command).to eq "bash"
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "run behavior" do
51
+ before do
52
+ subject.app = 'saturn'
53
+ subject.command = 'rails c'
54
+ RubyYacht.configure_second_test_project
55
+ allow(subject).to receive :exec
56
+ end
57
+
58
+ describe "default_project" do
59
+ it "is the first project defined" do
60
+ expect(subject.default_project.name).to eq :apollo
61
+ end
62
+ end
63
+
64
+ it "opens the shell in docker" do
65
+ subject.run
66
+ expect(subject).to have_received(:exec).with("docker exec -it apollo-saturn bash -c 'cd /var/code; TERM=xterm rails c'")
67
+ end
68
+
69
+ it "returns true" do
70
+ expect(subject.run).to be_truthy
71
+ end
72
+
73
+ context "with no app" do
74
+ before do
75
+ subject.app = nil
76
+ end
77
+
78
+ it "logs an error" do
79
+ subject.run
80
+ expect(@log_entries).to eq [
81
+ "You must provide an app name",
82
+ "Run rspec help shell for more information"
83
+ ]
84
+ end
85
+
86
+ it "returns false" do
87
+ expect(subject.run).to be_falsey
88
+ end
89
+ end
90
+
91
+ context "with a specific project" do
92
+ before do
93
+ subject.project_name = :jupiter
94
+ end
95
+
96
+ it "opens the shell in that project" do
97
+ subject.run
98
+ expect(subject).to have_received(:exec).with("docker exec -it jupiter-saturn bash -c 'cd /var/code; TERM=xterm rails c'")
99
+ end
100
+
101
+ it "returns true" do
102
+ expect(subject.run).to be_truthy
103
+ end
104
+ end
105
+
106
+ context "with an invalid project name" do
107
+ before do
108
+ subject.project_name = 'foo'
109
+ end
110
+
111
+ it "logs an error" do
112
+ subject.run
113
+ expect(@log_entries).to eq [
114
+ "There is no project named foo"
115
+ ]
116
+ end
117
+
118
+ it "returns false" do
119
+ expect(subject.run).to be_falsey
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,163 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+
4
+ describe RubyYacht::Runner::UpdateHosts do
5
+ include DockerCommandSpec
6
+
7
+ describe "command information" do
8
+ specify { expect(described_class.command).to eq 'update_hosts' }
9
+ specify { expect(described_class.description).to eq 'Add entries for your app domains to your hosts file' }
10
+ end
11
+
12
+ describe "current_host_contents" do
13
+ it "is the contents of the hosts file" do
14
+ expect(subject.current_host_contents).to eq File.read('/etc/hosts')
15
+ end
16
+ end
17
+
18
+ describe "run behavior" do
19
+ before do
20
+ allow(subject).to receive("current_host_contents").and_return(<<-EOS.gsub(/^ +/, '')
21
+ # Local information
22
+ 127.0.0.1 localhost
23
+
24
+ # Database server
25
+
26
+ 40.1.30.10 db1.test.com
27
+ EOS
28
+ )
29
+
30
+ allow(subject).to receive("get_machine_info").with('.Driver.IPAddress').and_return('192.168.1.27')
31
+ Timecop.freeze
32
+ end
33
+
34
+ after do
35
+ FileUtils.rm(File.join('tmp', 'hosts'))
36
+ Timecop.return
37
+ end
38
+
39
+ it "adds the entries to the hosts file in the tmp folder" do
40
+ subject.run
41
+ expect(File.exist?(File.join('tmp', 'hosts'))).to be_truthy
42
+
43
+ contents = File.read(File.join('tmp', 'hosts'))
44
+ expect(contents).to eq <<-EOS.gsub(/^ +/, '').strip
45
+ # Local information
46
+ 127.0.0.1 localhost
47
+
48
+ # Database server
49
+
50
+ 40.1.30.10 db1.test.com
51
+
52
+ # apollo docker containers
53
+ 192.168.1.27 apollo.test.com
54
+ 192.168.1.27 mars.apollo.test.com
55
+ 192.168.1.27 saturn.apollo.test.com
56
+ EOS
57
+
58
+ end
59
+
60
+ it "copies the hosts file to a backup, and the tmp hosts file to the hosts file" do
61
+ timestamp = Time.now.utc.strftime('%Y%m%d%H%M%S')
62
+ subject.run
63
+ expect(@system_commands).to eq ["sudo cp /etc/hosts /etc/hosts.#{timestamp}.backup", "sudo mv tmp/hosts /etc/hosts"]
64
+ end
65
+
66
+ it "returns true" do
67
+ expect(subject.run).to be_truthy
68
+ end
69
+
70
+ context "with existing entries in the hosts file" do
71
+ before do
72
+ allow(subject).to receive("current_host_contents").and_return(<<-EOS.gsub(/^ +/, '')
73
+ # Local information
74
+ 127.0.0.1 localhost
75
+
76
+ # Database server
77
+
78
+ 40.1.30.10 db1.test.com
79
+
80
+ # apollo docker containers
81
+ 192.168.1.24 apollo.test.com
82
+ 192.168.1.24 mars.apollo.test.com
83
+ 192.168.1.24 venus.apollo.test.com
84
+ EOS
85
+ )
86
+ end
87
+
88
+ it "replaces the existing entries with the correct entries" do
89
+ subject.run
90
+
91
+ contents = File.read(File.join('tmp', 'hosts'))
92
+ expect(contents).to eq <<-EOS.gsub(/^ +/, '').strip
93
+ # Local information
94
+ 127.0.0.1 localhost
95
+
96
+ # Database server
97
+
98
+ 40.1.30.10 db1.test.com
99
+
100
+ # apollo docker containers
101
+ 192.168.1.27 apollo.test.com
102
+ 192.168.1.27 mars.apollo.test.com
103
+ 192.168.1.27 saturn.apollo.test.com
104
+ EOS
105
+ end
106
+ end
107
+
108
+ context "with no address from docker machine" do
109
+ before do
110
+ allow(subject).to receive("get_machine_info").with('.Driver.IPAddress').and_return('')
111
+ end
112
+
113
+ it "points the domains to localhost" do
114
+ subject.run
115
+
116
+ contents = File.read(File.join('tmp', 'hosts'))
117
+ expect(contents).to eq <<-EOS.gsub(/^ +/, '').strip
118
+ # Local information
119
+ 127.0.0.1 localhost
120
+
121
+ # Database server
122
+
123
+ 40.1.30.10 db1.test.com
124
+
125
+ # apollo docker containers
126
+ 127.0.0.1 apollo.test.com
127
+ 127.0.0.1 mars.apollo.test.com
128
+ 127.0.0.1 saturn.apollo.test.com
129
+ EOS
130
+ end
131
+ end
132
+
133
+ context "with multiple projects" do
134
+ before do
135
+ RubyYacht.configure_second_test_project
136
+ end
137
+
138
+ it "creates entries for both projects" do
139
+ subject.run
140
+
141
+ contents = File.read(File.join('tmp', 'hosts'))
142
+ expect(contents).to eq <<-EOS.gsub(/^ +/, '').strip
143
+ # Local information
144
+ 127.0.0.1 localhost
145
+
146
+ # Database server
147
+
148
+ 40.1.30.10 db1.test.com
149
+
150
+ # apollo docker containers
151
+ 192.168.1.27 apollo.test.com
152
+ 192.168.1.27 mars.apollo.test.com
153
+ 192.168.1.27 saturn.apollo.test.com
154
+
155
+ # jupiter docker containers
156
+ 192.168.1.27 jupiter.test.com
157
+ 192.168.1.27 venus.jupiter.test.com
158
+ 192.168.1.27 saturn.jupiter.test.com
159
+ EOS
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,10 @@
1
+ require "codeclimate-test-reporter"
2
+ CodeClimate::TestReporter.start
3
+ SimpleCov.start do
4
+ coverage_dir 'doc/coverage'
5
+ add_filter './spec'
6
+ end
7
+
8
+ require 'ruby_yacht'
9
+
10
+ Dir[File.join('.', 'spec', 'support', '**', '*.rb')].each { |f| require f }