ruby_yacht 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/doc/TODO.md +1 -8
- data/lib/ruby_yacht/dsl/app.rb +37 -10
- data/lib/ruby_yacht/dsl/configuration.rb +21 -21
- data/lib/ruby_yacht/dsl/database.rb +53 -0
- data/lib/ruby_yacht/dsl/dsl.rb +14 -8
- data/lib/ruby_yacht/dsl/hook.rb +35 -15
- data/lib/ruby_yacht/dsl/project.rb +23 -10
- data/lib/ruby_yacht/dsl/{app_type.rb → server_type.rb} +39 -29
- data/lib/ruby_yacht/dsl.rb +1 -1
- data/lib/ruby_yacht/images/app/Dockerfile.erb +9 -5
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +2 -2
- data/lib/ruby_yacht/images/database/Dockerfile.erb +12 -11
- data/lib/ruby_yacht/images/web/Dockerfile.erb +6 -2
- data/lib/ruby_yacht/images/web/add_app.rb +7 -1
- data/lib/ruby_yacht/images/web/app_config.erb +2 -0
- data/lib/ruby_yacht/plugins/mysql/scripts/setup.bash +11 -0
- data/lib/ruby_yacht/plugins/mysql.rb +27 -0
- data/lib/ruby_yacht/plugins/rails/scripts/install_gems.rb +6 -1
- data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +6 -4
- data/lib/ruby_yacht/plugins/rails/scripts/prepare_rails_for_launch.rb +1 -0
- data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +1 -5
- data/lib/ruby_yacht/plugins/rails.rb +12 -4
- data/lib/ruby_yacht/plugins.rb +2 -1
- data/lib/ruby_yacht/runner/build_images.rb +32 -26
- data/lib/ruby_yacht/runner/checkout.rb +5 -4
- data/lib/ruby_yacht/runner/run_containers.rb +7 -6
- data/lib/ruby_yacht/runner/services.rb +2 -2
- data/lib/ruby_yacht/runner/shell.rb +5 -4
- data/lib/ruby_yacht/runner/update_hosts.rb +2 -1
- data/ruby_yacht.gemspec +1 -1
- data/spec/dsl/app_spec.rb +96 -10
- data/spec/dsl/configuration_spec.rb +53 -55
- data/spec/dsl/database_spec.rb +70 -12
- data/spec/dsl/hook_spec.rb +36 -19
- data/spec/dsl/project_spec.rb +26 -18
- data/spec/dsl/{app_type_spec.rb → server_type_spec.rb} +52 -28
- data/spec/fixtures/app-dependencies-dockerfile-rails +3 -0
- data/spec/fixtures/database-dockerfile +1 -8
- data/spec/fixtures/database-dockerfile-mysql +30 -0
- data/spec/fixtures/database-dockerfile-rails +1 -5
- data/spec/fixtures/database-dockerfile-with-seed-hooks +1 -8
- data/spec/fixtures/mars-before-startup-with-custom-file-copy +6 -0
- data/spec/fixtures/mars-dockerfile +0 -4
- data/spec/fixtures/mars-dockerfile-rails +2 -2
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +0 -4
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +0 -4
- data/spec/fixtures/mars-dockerfile-with-custom-file-copy +23 -0
- data/spec/fixtures/mars-dockerfile-with-local-database +27 -0
- data/spec/fixtures/mars-dockerfile-with-remote-database +27 -0
- data/spec/fixtures/web-dockerfile-with-eponymous-app +20 -0
- data/spec/plugins/mysql_spec.rb +64 -0
- data/spec/plugins/rails_spec.rb +103 -43
- data/spec/runner/build_images_spec.rb +142 -11
- data/spec/runner/checkout_spec.rb +4 -4
- data/spec/runner/run_containers_spec.rb +21 -2
- data/spec/runner/runner_spec.rb +1 -1
- data/spec/runner/services_spec.rb +7 -2
- data/spec/runner/shell_spec.rb +3 -3
- data/spec/runner/update_hosts_spec.rb +26 -0
- data/spec/support/test_project.rb +16 -20
- metadata +20 -5
- data/lib/ruby_yacht/images/database/setup.bash +0 -15
@@ -13,7 +13,7 @@ module RubyYacht::Runner
|
|
13
13
|
attr_accessor :project_name
|
14
14
|
|
15
15
|
# The name of the app that we are opening a shell in.
|
16
|
-
attr_accessor :
|
16
|
+
attr_accessor :app_name
|
17
17
|
|
18
18
|
# The name of the command that we are invoking in the shell.
|
19
19
|
attr_accessor :command
|
@@ -39,7 +39,7 @@ module RubyYacht::Runner
|
|
39
39
|
#
|
40
40
|
# * **arguments: Array** The command-line arguments.
|
41
41
|
def parse_positional_arguments(arguments)
|
42
|
-
self.
|
42
|
+
self.app_name = arguments.shift
|
43
43
|
self.command = arguments.join(' ')
|
44
44
|
if self.command == ''
|
45
45
|
self.command = 'bash'
|
@@ -48,7 +48,7 @@ module RubyYacht::Runner
|
|
48
48
|
|
49
49
|
# This method runs the logic for the command.
|
50
50
|
def run
|
51
|
-
if
|
51
|
+
if app_name.nil?
|
52
52
|
log "You must provide an app name"
|
53
53
|
log "Run #{Command.short_script_name} help shell for more information"
|
54
54
|
return false
|
@@ -57,7 +57,8 @@ module RubyYacht::Runner
|
|
57
57
|
project = self.project_named(project_name)
|
58
58
|
return false unless project
|
59
59
|
|
60
|
-
|
60
|
+
app = project.apps.find { |a| a.name == app_name.to_sym }
|
61
|
+
container = app.container_name(project)
|
61
62
|
exec("docker exec -it #{container} bash -c 'cd /var/code; TERM=xterm #{command}'")
|
62
63
|
true
|
63
64
|
end
|
@@ -60,7 +60,8 @@ module RubyYacht::Runner
|
|
60
60
|
main_domain = project.domain
|
61
61
|
|
62
62
|
domains = [main_domain]
|
63
|
-
|
63
|
+
apps = project.apps.select { |app| app.name != system_prefix }
|
64
|
+
domains += apps.map { |app| "#{app.name}.#{main_domain}" }
|
64
65
|
|
65
66
|
header = "# #{system_prefix} docker containers"
|
66
67
|
new_hosts = ["", header]
|
data/ruby_yacht.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'ruby_yacht'
|
3
|
-
spec.version = '0.
|
3
|
+
spec.version = '0.4.0'
|
4
4
|
spec.date = '2016-04-19'
|
5
5
|
spec.description = "A DSL for building docker containers for a family of Rails apps"
|
6
6
|
spec.summary = "A DSL for building docker containers for a family of Rails apps"
|
data/spec/dsl/app_spec.rb
CHANGED
@@ -8,7 +8,8 @@ RSpec.describe RubyYacht::App do
|
|
8
8
|
before do
|
9
9
|
RubyYacht.configuration.clear
|
10
10
|
RubyYacht.configure do
|
11
|
-
|
11
|
+
server_type :test do
|
12
|
+
container_type :app
|
12
13
|
baseline_image 'ubuntu'
|
13
14
|
end
|
14
15
|
end
|
@@ -17,50 +18,84 @@ RSpec.describe RubyYacht::App do
|
|
17
18
|
it "creates an app with all fields" do
|
18
19
|
@builder = Proc.new do
|
19
20
|
repository_name 'brownleej/test-app'
|
20
|
-
|
21
|
+
database_name :database
|
22
|
+
server_type :test
|
21
23
|
port 3000
|
22
24
|
end
|
23
25
|
expect(app.name).to eq :test_app
|
24
26
|
expect(app.repository_name).to eq 'brownleej/test-app'
|
25
|
-
expect(app.
|
27
|
+
expect(app.database_name).to eq :database
|
28
|
+
expect(app.server_type).to eq :test
|
26
29
|
expect(app.port).to eq 3000
|
27
30
|
end
|
28
31
|
|
29
32
|
it "requires the repository name" do
|
30
33
|
@builder = Proc.new do
|
31
34
|
port 3000
|
32
|
-
|
35
|
+
server_type :test
|
36
|
+
database_name :database
|
33
37
|
end
|
34
38
|
expect do
|
35
39
|
self.app
|
36
40
|
end.to raise_exception("Missing required attribute repository_name for RubyYacht::App::DSL")
|
37
41
|
end
|
38
42
|
|
39
|
-
it "requires the
|
43
|
+
it "requires the server type" do
|
40
44
|
@builder = Proc.new do
|
41
45
|
repository_name 'brownleej/test-app'
|
42
46
|
port 3000
|
47
|
+
database_name :database
|
43
48
|
end
|
44
49
|
expect do
|
45
50
|
self.app
|
46
|
-
end.to raise_exception("Missing required attribute
|
51
|
+
end.to raise_exception("Missing required attribute server_type for RubyYacht::App::DSL")
|
47
52
|
end
|
48
53
|
|
49
|
-
it "
|
54
|
+
it "does not require the database name" do
|
50
55
|
@builder = Proc.new do
|
51
|
-
app_type :invalid
|
52
56
|
repository_name 'brownleej/test-app'
|
57
|
+
server_type :test
|
53
58
|
port 3000
|
54
59
|
end
|
60
|
+
expect(app.database_name).to be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it "requires a defined server type" do
|
64
|
+
@builder = Proc.new do
|
65
|
+
server_type :invalid
|
66
|
+
repository_name 'brownleej/test-app'
|
67
|
+
port 3000
|
68
|
+
database_name :database
|
69
|
+
end
|
70
|
+
expect do
|
71
|
+
self.app
|
72
|
+
end.to raise_exception("App has invalid server type `invalid`")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "requires a defined server type for apps" do
|
76
|
+
RubyYacht.configure do
|
77
|
+
server_type :sqlite do
|
78
|
+
container_type :database
|
79
|
+
baseline_image 'ubuntu'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@builder = Proc.new do
|
84
|
+
server_type :sqlite
|
85
|
+
repository_name 'brownleej/test-app'
|
86
|
+
port 3000
|
87
|
+
database_name :database
|
88
|
+
end
|
55
89
|
expect do
|
56
90
|
self.app
|
57
|
-
end.to raise_exception("App has invalid
|
91
|
+
end.to raise_exception("App has invalid server type `sqlite`")
|
58
92
|
end
|
59
93
|
|
60
94
|
it "defaults the port to 8080" do
|
61
95
|
@builder = Proc.new do
|
62
96
|
repository_name 'brownleej/test-app'
|
63
|
-
|
97
|
+
server_type :test
|
98
|
+
database_name :database
|
64
99
|
end
|
65
100
|
expect(app.port).to eq 8080
|
66
101
|
end
|
@@ -77,5 +112,56 @@ RSpec.describe RubyYacht::App do
|
|
77
112
|
|
78
113
|
expect(app.container_name(project)).to eq 'tests-app1'
|
79
114
|
end
|
115
|
+
|
116
|
+
context "with the same name as the project's system_prefix" do
|
117
|
+
it "is just the project's system prefix" do
|
118
|
+
project = RubyYacht::Project.new
|
119
|
+
project.name = :test_project
|
120
|
+
project.system_prefix = :tests
|
121
|
+
|
122
|
+
app = RubyYacht::App.new
|
123
|
+
app.name = :tests
|
124
|
+
|
125
|
+
expect(app.container_name(project)).to eq 'tests'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "database" do
|
131
|
+
before do
|
132
|
+
@project = RubyYacht::Project.new
|
133
|
+
@project.name = :test_project
|
134
|
+
@project.system_prefix = :tests
|
135
|
+
|
136
|
+
database1 = RubyYacht::Database.new
|
137
|
+
database1.name = 'main_db'
|
138
|
+
database1.host = 'localhost'
|
139
|
+
|
140
|
+
database2 = RubyYacht::Database.new
|
141
|
+
database2.name = 'second_db'
|
142
|
+
database2.host = 'db2.test.com'
|
143
|
+
|
144
|
+
@project.databases = [database1, database2]
|
145
|
+
|
146
|
+
@app = RubyYacht::App.new
|
147
|
+
@app.name = 'app1'
|
148
|
+
@app.database_name = 'second_db'
|
149
|
+
end
|
150
|
+
|
151
|
+
it "is the database with the app's database_name" do
|
152
|
+
database = @app.database(@project)
|
153
|
+
expect(database).not_to be_nil
|
154
|
+
expect(database.host).to eq 'db2.test.com'
|
155
|
+
end
|
156
|
+
|
157
|
+
context "with no matching database" do
|
158
|
+
before do
|
159
|
+
@project.databases.pop
|
160
|
+
end
|
161
|
+
|
162
|
+
it "is nil" do
|
163
|
+
expect(@app.database(@project)).to be_nil
|
164
|
+
end
|
165
|
+
end
|
80
166
|
end
|
81
167
|
end
|
@@ -10,26 +10,28 @@ describe RubyYacht::Configuration do
|
|
10
10
|
describe "fetch_hooks" do
|
11
11
|
before do
|
12
12
|
RubyYacht.configure do
|
13
|
-
|
13
|
+
server_type :test do
|
14
|
+
container_type :app
|
14
15
|
baseline_image 'ubuntu'
|
15
16
|
end
|
16
|
-
|
17
|
+
server_type :php do
|
18
|
+
container_type :app
|
17
19
|
baseline_image 'ubuntu'
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
RubyYacht.configure do
|
22
|
-
add_hooks
|
24
|
+
add_hooks server_type: :test, folder: '.' do
|
23
25
|
before(:startup) { run_script 'a.rb' }
|
24
26
|
before(:install_libraries) { run_script 'a.rb' }
|
25
27
|
|
26
28
|
before :startup do
|
27
|
-
|
29
|
+
server_type :php
|
28
30
|
run_script 'c.rb'
|
29
31
|
end
|
30
32
|
|
31
33
|
before :startup do
|
32
|
-
|
34
|
+
server_type :test
|
33
35
|
run_script 'd.rb'
|
34
36
|
end
|
35
37
|
end
|
@@ -37,23 +39,30 @@ describe RubyYacht::Configuration do
|
|
37
39
|
end
|
38
40
|
|
39
41
|
it "returns hooks with the matching attributes" do
|
40
|
-
hooks = RubyYacht.configuration.fetch_hooks(
|
42
|
+
hooks = RubyYacht.configuration.fetch_hooks(server_type: :test, event_type: :startup)
|
41
43
|
expect(hooks.count).to eq 2
|
42
|
-
expect(hooks[0].
|
43
|
-
expect(hooks[1].
|
44
|
+
expect(hooks[0].copied_file_path).to eq './a.rb'
|
45
|
+
expect(hooks[1].copied_file_path).to eq './d.rb'
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
47
|
-
describe "
|
49
|
+
describe "find_server_type" do
|
48
50
|
before do
|
49
51
|
RubyYacht.configure do
|
50
|
-
|
51
|
-
|
52
|
+
server_type :generic do
|
53
|
+
container_type :app
|
54
|
+
baseline_image 'ubuntu'
|
55
|
+
end
|
56
|
+
|
57
|
+
server_type :debian do
|
58
|
+
container_type :app
|
59
|
+
baseline_image 'debian'
|
60
|
+
end
|
52
61
|
end
|
53
62
|
end
|
54
63
|
|
55
64
|
it "returns the app type with that name" do
|
56
|
-
type = RubyYacht.configuration.
|
65
|
+
type = RubyYacht.configuration.find_server_type(:debian)
|
57
66
|
expect(type.baseline_image).to eq 'debian'
|
58
67
|
end
|
59
68
|
end
|
@@ -66,33 +75,19 @@ describe RubyYacht::Configuration do
|
|
66
75
|
system_prefix :a
|
67
76
|
domain "a.test.com"
|
68
77
|
repository "github.com"
|
69
|
-
|
70
|
-
database do
|
71
|
-
host "localhost"
|
72
|
-
name "project1"
|
73
|
-
username "test"
|
74
|
-
password "test"
|
75
|
-
end
|
76
78
|
end
|
77
79
|
|
78
80
|
project :project2 do
|
79
81
|
system_prefix :b
|
80
82
|
domain "b.test.com"
|
81
83
|
repository "github.com"
|
82
|
-
|
83
|
-
database do
|
84
|
-
host "localhost"
|
85
|
-
name "project2"
|
86
|
-
username "test"
|
87
|
-
password "test"
|
88
|
-
end
|
89
84
|
end
|
90
85
|
end
|
91
86
|
end
|
92
87
|
|
93
88
|
let(:hook_creation_block) do
|
94
89
|
Proc.new do
|
95
|
-
add_hooks
|
90
|
+
add_hooks server_type: :configuration_test, folder: './scripts' do
|
96
91
|
before :startup do
|
97
92
|
run_script 'update_config.rb'
|
98
93
|
end
|
@@ -100,18 +95,20 @@ describe RubyYacht::Configuration do
|
|
100
95
|
end
|
101
96
|
end
|
102
97
|
|
103
|
-
let(:
|
98
|
+
let(:server_type_creation_block) do
|
104
99
|
Proc.new do
|
105
|
-
|
100
|
+
server_type :second_configuration_test do
|
101
|
+
container_type :app
|
106
102
|
baseline_image 'debian'
|
107
|
-
|
103
|
+
server_attribute :test_attribute
|
108
104
|
end
|
109
105
|
end
|
110
106
|
end
|
111
107
|
|
112
108
|
before do
|
113
109
|
RubyYacht.configure do
|
114
|
-
|
110
|
+
server_type :configuration_test do
|
111
|
+
container_type :app
|
115
112
|
baseline_image 'ubuntu'
|
116
113
|
end
|
117
114
|
end
|
@@ -129,20 +126,20 @@ describe RubyYacht::Configuration do
|
|
129
126
|
expect(configuration.hooks.count).to eq 1
|
130
127
|
expect(configuration.hooks[0].event_time).to eq :before
|
131
128
|
expect(configuration.hooks[0].event_type).to eq :startup
|
132
|
-
expect(configuration.hooks[0].
|
129
|
+
expect(configuration.hooks[0].copied_file_path).to eq './scripts/update_config.rb'
|
133
130
|
end
|
134
131
|
|
135
|
-
it "can
|
136
|
-
configuration = RubyYacht::Configuration::DSL.new.run(
|
137
|
-
expect(configuration.
|
138
|
-
expect(configuration.
|
139
|
-
expect(configuration.
|
140
|
-
expect(configuration.
|
132
|
+
it "can server types" do
|
133
|
+
configuration = RubyYacht::Configuration::DSL.new.run(server_type_creation_block).create_object
|
134
|
+
expect(configuration.server_types.count).to eq 1
|
135
|
+
expect(configuration.server_types[0].name).to eq :second_configuration_test
|
136
|
+
expect(configuration.server_types[0].project_attributes.count).to eq 0
|
137
|
+
expect(configuration.server_types[0].server_attributes.count).to eq 1
|
141
138
|
end
|
142
139
|
|
143
140
|
it "can add `during` hooks" do
|
144
141
|
configuration = RubyYacht::Configuration::DSL.new.run(Proc.new do
|
145
|
-
add_hooks
|
142
|
+
add_hooks server_type: :configuration_test, folder: './scripts' do
|
146
143
|
during :startup do
|
147
144
|
run_script 'start_app.rb'
|
148
145
|
end
|
@@ -151,12 +148,12 @@ describe RubyYacht::Configuration do
|
|
151
148
|
expect(configuration.hooks.count).to eq 1
|
152
149
|
expect(configuration.hooks[0].event_time).to eq :during
|
153
150
|
expect(configuration.hooks[0].event_type).to eq :startup
|
154
|
-
expect(configuration.hooks[0].
|
151
|
+
expect(configuration.hooks[0].copied_file_path).to eq './scripts/start_app.rb'
|
155
152
|
end
|
156
153
|
|
157
154
|
it "can add `after` hooks" do
|
158
155
|
configuration = RubyYacht::Configuration::DSL.new.run(Proc.new do
|
159
|
-
add_hooks
|
156
|
+
add_hooks server_type: :configuration_test, folder: './scripts' do
|
160
157
|
after :startup do
|
161
158
|
run_script 'start_app.rb'
|
162
159
|
end
|
@@ -165,7 +162,7 @@ describe RubyYacht::Configuration do
|
|
165
162
|
expect(configuration.hooks.count).to eq 1
|
166
163
|
expect(configuration.hooks[0].event_time).to eq :after
|
167
164
|
expect(configuration.hooks[0].event_type).to eq :startup
|
168
|
-
expect(configuration.hooks[0].
|
165
|
+
expect(configuration.hooks[0].copied_file_path).to eq './scripts/start_app.rb'
|
169
166
|
end
|
170
167
|
|
171
168
|
describe "configure method" do
|
@@ -186,36 +183,37 @@ describe RubyYacht::Configuration do
|
|
186
183
|
hook = RubyYacht::Hook.new
|
187
184
|
hook.event_time = :after
|
188
185
|
hook.event_type = :restart_application
|
189
|
-
hook.
|
186
|
+
hook.copied_file_path = './scripts/log_success.rb'
|
190
187
|
RubyYacht.configuration.hooks << hook
|
191
188
|
RubyYacht.configure(&hook_creation_block)
|
192
189
|
|
193
190
|
configuration = RubyYacht.configuration
|
194
191
|
expect(configuration.hooks.count).to eq 2
|
195
|
-
expect(configuration.hooks[0].
|
196
|
-
expect(configuration.hooks[1].
|
192
|
+
expect(configuration.hooks[0].copied_file_path).to eq './scripts/log_success.rb'
|
193
|
+
expect(configuration.hooks[1].copied_file_path).to eq './scripts/update_config.rb'
|
197
194
|
end
|
198
195
|
|
199
|
-
it "adds to the list of
|
200
|
-
RubyYacht.configure(&
|
196
|
+
it "adds to the list of server types" do
|
197
|
+
RubyYacht.configure(&server_type_creation_block)
|
201
198
|
|
202
199
|
configuration = RubyYacht.configuration
|
203
|
-
expect(configuration.
|
204
|
-
expect(configuration.
|
205
|
-
expect(configuration.
|
200
|
+
expect(configuration.server_types.count).to eq 2
|
201
|
+
expect(configuration.server_types[0].name).to eq :configuration_test
|
202
|
+
expect(configuration.server_types[1].name).to eq :second_configuration_test
|
206
203
|
end
|
207
204
|
|
208
|
-
context "with
|
205
|
+
context "with a server type that is already registered" do
|
209
206
|
before do
|
210
|
-
type = RubyYacht::
|
207
|
+
type = RubyYacht::ServerType.new
|
211
208
|
type.name = :second_configuration_test
|
212
|
-
|
209
|
+
type.server_attributes = []
|
210
|
+
RubyYacht.configuration.server_types << type
|
213
211
|
end
|
214
212
|
|
215
213
|
it "raises an exception" do
|
216
214
|
expect(lambda do
|
217
|
-
RubyYacht.configure(&
|
218
|
-
end).to raise_exception "
|
215
|
+
RubyYacht.configure(&server_type_creation_block)
|
216
|
+
end).to raise_exception "Server type already registered: second_configuration_test"
|
219
217
|
end
|
220
218
|
end
|
221
219
|
end
|
data/spec/dsl/database_spec.rb
CHANGED
@@ -1,61 +1,104 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe RubyYacht::Database do
|
4
|
+
before do
|
5
|
+
RubyYacht.configuration.clear
|
6
|
+
RubyYacht.configure do
|
7
|
+
server_type :sqlite do
|
8
|
+
container_type :database
|
9
|
+
baseline_image 'ubuntu'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
describe "dsl" do
|
5
|
-
let(:database) { RubyYacht::Database::DSL.new.run(@builder).create_object }
|
15
|
+
let(:database) { RubyYacht::Database::DSL.new(:apps, :sqlite).run(@builder).create_object }
|
6
16
|
|
7
17
|
it "creates a database with all the fields" do
|
8
18
|
@builder = Proc.new do
|
9
19
|
host 'db1.test.com'
|
10
|
-
name 'apps'
|
11
20
|
username 'test-user'
|
12
21
|
password 'test-pass'
|
22
|
+
container_label :database
|
13
23
|
end
|
14
24
|
|
15
25
|
expect(database.host).to eq 'db1.test.com'
|
16
|
-
expect(database.name).to eq
|
26
|
+
expect(database.name).to eq :apps
|
27
|
+
expect(database.server_type).to eq :sqlite
|
17
28
|
expect(database.username).to eq 'test-user'
|
18
29
|
expect(database.password).to eq 'test-pass'
|
30
|
+
expect(database.container_label).to eq :database
|
19
31
|
end
|
20
32
|
|
21
33
|
it "requires the host" do
|
22
34
|
@builder = Proc.new do
|
23
|
-
name 'apps'
|
24
35
|
username 'test-user'
|
25
36
|
password 'test-pass'
|
37
|
+
container_label :database
|
26
38
|
end
|
27
39
|
|
28
40
|
expect { database }.to raise_exception "Missing required attribute host for RubyYacht::Database::DSL"
|
29
41
|
end
|
30
42
|
|
31
|
-
it "requires the
|
43
|
+
it "requires the username" do
|
44
|
+
@builder = Proc.new do
|
45
|
+
host 'db1.test.com'
|
46
|
+
password 'test-pass'
|
47
|
+
container_label :database
|
48
|
+
end
|
49
|
+
|
50
|
+
expect { database }.to raise_exception "Missing required attribute username for RubyYacht::Database::DSL"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "requires the password" do
|
54
|
+
@builder = Proc.new do
|
55
|
+
host 'db1.test.com'
|
56
|
+
username 'test-user'
|
57
|
+
container_label :database
|
58
|
+
end
|
59
|
+
|
60
|
+
expect { database }.to raise_exception "Missing required attribute password for RubyYacht::Database::DSL"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "uses 'database' as the default container label" do
|
32
64
|
@builder = Proc.new do
|
33
65
|
host 'db1.test.com'
|
34
66
|
username 'test-user'
|
35
67
|
password 'test-pass'
|
36
68
|
end
|
37
69
|
|
38
|
-
expect
|
70
|
+
expect(database.container_label).to eq :database
|
39
71
|
end
|
40
72
|
|
41
|
-
it "requires
|
73
|
+
it "requires a defined server type" do
|
42
74
|
@builder = Proc.new do
|
43
75
|
host 'db1.test.com'
|
44
|
-
|
76
|
+
username 'test-user'
|
45
77
|
password 'test-pass'
|
78
|
+
container_label :database
|
79
|
+
server_type :invalid
|
46
80
|
end
|
47
81
|
|
48
|
-
expect { database }.to raise_exception "
|
82
|
+
expect { database }.to raise_exception "Database has invalid server type `invalid`"
|
49
83
|
end
|
50
84
|
|
51
|
-
it "requires
|
85
|
+
it "requires a defined server type for a database" do
|
86
|
+
RubyYacht.configure do
|
87
|
+
server_type :generic do
|
88
|
+
container_type :app
|
89
|
+
baseline_image 'ruby:2.3'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
52
93
|
@builder = Proc.new do
|
53
94
|
host 'db1.test.com'
|
54
|
-
name 'apps'
|
55
95
|
username 'test-user'
|
96
|
+
password 'test-pass'
|
97
|
+
container_label :database
|
98
|
+
server_type :generic
|
56
99
|
end
|
57
100
|
|
58
|
-
expect { database }.to raise_exception "
|
101
|
+
expect { database }.to raise_exception "Database has invalid server type `generic`"
|
59
102
|
end
|
60
103
|
end
|
61
104
|
|
@@ -72,4 +115,19 @@ describe RubyYacht::Database do
|
|
72
115
|
expect(database).not_to be_local
|
73
116
|
end
|
74
117
|
end
|
118
|
+
|
119
|
+
describe "container_name" do
|
120
|
+
before do
|
121
|
+
@project = RubyYacht::Project.new
|
122
|
+
@project.name = :test_project
|
123
|
+
@project.system_prefix = :tests
|
124
|
+
|
125
|
+
@database = RubyYacht::Database.new
|
126
|
+
@database.container_label = 'mysql'
|
127
|
+
end
|
128
|
+
|
129
|
+
it "combines the project's prefix with the database's container label" do
|
130
|
+
expect(@database.container_name(@project)).to eq 'tests-mysql'
|
131
|
+
end
|
132
|
+
end
|
75
133
|
end
|