ruby_yacht 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rdoc_options +8 -2
- data/.rspec +1 -0
- data/.travis.yml +17 -1
- data/Gemfile.lock +18 -2
- data/README.md +28 -10
- data/bin/ruby_yacht +5 -0
- data/doc/TODO.md +1 -20
- data/doc/configuration.md +104 -21
- data/doc/configuration_sample.rb +19 -8
- data/doc/contributing.md +28 -5
- data/doc/plugins.md +105 -45
- data/lib/ruby_yacht/dsl/app.rb +14 -18
- data/lib/ruby_yacht/dsl/configuration.rb +51 -32
- data/lib/ruby_yacht/dsl/database.rb +24 -8
- data/lib/ruby_yacht/dsl/dsl.rb +32 -4
- data/lib/ruby_yacht/dsl/hook.rb +182 -48
- data/lib/ruby_yacht/dsl/project.rb +20 -14
- data/lib/ruby_yacht/dsl/server_type.rb +14 -31
- data/lib/ruby_yacht/dsl/web_server.rb +87 -0
- data/lib/ruby_yacht/dsl.rb +1 -0
- data/lib/ruby_yacht/images/app/Dockerfile.erb +17 -6
- data/lib/ruby_yacht/images/app/before_startup.bash.erb +5 -3
- data/lib/ruby_yacht/images/app/startup.bash.erb +5 -2
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +7 -11
- data/lib/ruby_yacht/images/database/Dockerfile.erb +7 -18
- data/lib/ruby_yacht/images/database/startup.bash.erb +1 -1
- data/lib/ruby_yacht/images/web/Dockerfile.erb +25 -19
- data/lib/ruby_yacht/plugins/mysql.rb +18 -8
- data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_app.rb +5 -5
- data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_project.rb +3 -3
- data/lib/ruby_yacht/plugins/nginx.rb +28 -0
- data/lib/ruby_yacht/plugins/rails/scripts/build_new_app.rb +10 -0
- data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +6 -1
- data/lib/ruby_yacht/plugins/rails.rb +34 -19
- data/lib/ruby_yacht/plugins.rb +2 -1
- data/lib/ruby_yacht/runner/build_images.rb +87 -73
- data/lib/ruby_yacht/runner/checkout.rb +1 -1
- data/lib/ruby_yacht/runner/command.rb +13 -1
- data/lib/ruby_yacht/runner/create_new_project.rb +91 -0
- data/lib/ruby_yacht/runner/help.rb +1 -1
- data/lib/ruby_yacht/runner/run_containers.rb +17 -21
- data/lib/ruby_yacht/runner/runner.rb +27 -2
- data/lib/ruby_yacht/runner/services.rb +15 -10
- data/lib/ruby_yacht/runner/shell.rb +1 -1
- data/lib/ruby_yacht/runner/update_hosts.rb +16 -11
- data/lib/ruby_yacht/runner.rb +1 -0
- data/log/.gitkeep +0 -0
- data/ruby_yacht.gemspec +4 -2
- data/spec/docker/Dockerfile +19 -3
- data/spec/docker/install_gems.bash +5 -0
- data/spec/docker/run.bash +44 -0
- data/spec/docker/startup.bash +10 -0
- data/spec/dsl/app_spec.rb +66 -38
- data/spec/dsl/configuration_spec.rb +236 -30
- data/spec/dsl/database_spec.rb +103 -4
- data/spec/dsl/dsl_spec.rb +46 -3
- data/spec/dsl/hook_spec.rb +278 -57
- data/spec/dsl/project_spec.rb +75 -45
- data/spec/dsl/server_type_spec.rb +52 -12
- data/spec/dsl/web_server_spec.rb +160 -0
- data/spec/fixtures/apollo-new-project-config +20 -0
- data/spec/fixtures/app-dependencies-dockerfile-generic +4 -7
- data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +6 -10
- data/spec/fixtures/app-dependencies-dockerfile-rails +9 -11
- data/spec/fixtures/app-dependencies-dockerfile-with-no-repository +20 -0
- data/spec/fixtures/database-dockerfile +1 -1
- data/spec/fixtures/database-dockerfile-mysql +3 -3
- data/spec/fixtures/database-dockerfile-rails +5 -4
- data/spec/fixtures/database-dockerfile-rails-with-no-repository +27 -0
- data/spec/fixtures/database-dockerfile-with-seed-hooks +3 -3
- data/spec/fixtures/database-startup-mysql +2 -1
- data/spec/fixtures/mars-before-startup +2 -2
- data/spec/fixtures/mars-before-startup-rails +5 -4
- data/spec/fixtures/mars-before-startup-with-before-startup-hooks +5 -4
- data/spec/fixtures/mars-before-startup-with-custom-file-copy +3 -3
- data/spec/fixtures/mars-before-startup-with-no-repository +3 -0
- data/spec/fixtures/mars-dockerfile +3 -2
- data/spec/fixtures/mars-dockerfile-rails +6 -5
- data/spec/fixtures/mars-dockerfile-rails-with-no-repository +32 -0
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +5 -4
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +5 -4
- data/spec/fixtures/mars-dockerfile-with-custom-file-copy +4 -3
- data/spec/fixtures/mars-dockerfile-with-local-database +4 -2
- data/spec/fixtures/mars-dockerfile-with-no-repository +22 -0
- data/spec/fixtures/mars-dockerfile-with-remote-database +4 -2
- data/spec/fixtures/mars-startup +2 -2
- data/spec/fixtures/mars-startup-rails +2 -2
- data/spec/fixtures/mars-startup-rails-with-no-repository +5 -0
- data/spec/fixtures/mars-startup-with-no-repository +4 -0
- data/spec/fixtures/web-dockerfile +18 -11
- data/spec/fixtures/web-dockerfile-jupiter +28 -0
- data/spec/fixtures/web-dockerfile-nginx +38 -0
- data/spec/fixtures/web-dockerfile-with-eponymous-app +16 -10
- data/spec/fixtures/web-dockerfile-with-primary-app +16 -10
- data/spec/integration/build_images_spec.rb +210 -0
- data/spec/integration/build_spec.rb +23 -0
- data/spec/integration/checkout_spec.rb +94 -0
- data/spec/integration/create_new_project_spec.rb +50 -0
- data/spec/integration/implode_spec.rb +20 -0
- data/spec/integration/run.rb +93 -0
- data/spec/integration/run_containers_spec.rb +279 -0
- data/spec/integration/services_spec.rb +99 -0
- data/spec/integration/shell_spec.rb +31 -0
- data/spec/integration/update_hosts_spec.rb +35 -0
- data/spec/plugins/mysql_spec.rb +18 -1
- data/spec/plugins/nginx_spec.rb +66 -0
- data/spec/plugins/rails_spec.rb +61 -89
- data/spec/runner/build_images_spec.rb +111 -58
- data/spec/runner/command_spec.rb +55 -3
- data/spec/runner/create_new_project_spec.rb +93 -0
- data/spec/runner/help_spec.rb +5 -1
- data/spec/runner/run_containers_spec.rb +22 -10
- data/spec/runner/runner_spec.rb +31 -4
- data/spec/runner/services_spec.rb +32 -4
- data/spec/runner/update_hosts_spec.rb +2 -1
- data/spec/spec_helper.rb +16 -1
- data/spec/support/integration_helpers.rb +76 -0
- data/spec/support/test_project.rb +15 -3
- metadata +97 -14
- data/spec/docker/build.bash +0 -10
- data/spec/fixtures/deploy-dockerfile +0 -2
- data/spec/fixtures/multi-project-web-dockerfile +0 -25
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/app_config.erb +0 -0
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index.html.erb +0 -0
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index_config.erb +0 -0
data/doc/plugins.md
CHANGED
@@ -29,8 +29,8 @@ You can add the following fields to fill out the server type:
|
|
29
29
|
<tr>
|
30
30
|
<td>container_type</td>
|
31
31
|
<td>
|
32
|
-
The type of container that this server type applies to. This can be
|
33
|
-
`
|
32
|
+
The type of container that this server type applies to. This can be `app`,
|
33
|
+
`database`, or `web`.
|
34
34
|
</td>
|
35
35
|
<td>
|
36
36
|
<code>container_type :app</code>
|
@@ -45,7 +45,8 @@ You can add the following fields to fill out the server type:
|
|
45
45
|
these servers.
|
46
46
|
</p>
|
47
47
|
<p>
|
48
|
-
This is currently
|
48
|
+
This is currently ignored for database images, since those are built off
|
49
|
+
of the app dependencies image.
|
49
50
|
</p>
|
50
51
|
</td>
|
51
52
|
<td>
|
@@ -91,34 +92,23 @@ You can add the following fields to fill out the server type:
|
|
91
92
|
<td>None; no custom server attributes</td>
|
92
93
|
</tr>
|
93
94
|
<tr>
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
<
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
</
|
110
|
-
<
|
111
|
-
You can call this multiple times to define multiple environment variables.
|
112
|
-
</p>
|
113
|
-
</td>
|
114
|
-
<td>
|
115
|
-
<code>
|
116
|
-
environment_variable :app_dependencies, 'RAILS_ENV' do
|
117
|
-
@project.rails_environment
|
118
|
-
end
|
119
|
-
</code>
|
120
|
-
</td>
|
121
|
-
<td>None; no custom environment variables.</td>
|
95
|
+
<td>server_default</td>
|
96
|
+
<td>
|
97
|
+
<p>
|
98
|
+
This defines a default value for an existing attribute on servers of
|
99
|
+
this type.
|
100
|
+
</p>
|
101
|
+
<p>
|
102
|
+
This accepts hash of options. The keys in this hash are the names of the
|
103
|
+
attributes, and the values are the default values.
|
104
|
+
</p>
|
105
|
+
<p>
|
106
|
+
You can call this multiple times, and it will add the new defaults to
|
107
|
+
the list.
|
108
|
+
</p>
|
109
|
+
</td>
|
110
|
+
<td><code>server_default port: 3000</code></td>
|
111
|
+
<td>None; no custom default values.</td>
|
122
112
|
</tr>
|
123
113
|
</table>
|
124
114
|
|
@@ -151,9 +141,22 @@ These are the event types that you can hook into:
|
|
151
141
|
The code for an app is being checked out when building an app image.
|
152
142
|
</td>
|
153
143
|
</tr>
|
144
|
+
<tr>
|
145
|
+
<td>build_new_app</td>
|
146
|
+
<td>
|
147
|
+
An app is being created from scratch rather than checked out from a
|
148
|
+
repository.
|
149
|
+
</td>
|
150
|
+
</tr>
|
154
151
|
<tr>
|
155
152
|
<td>install_libraries</td>
|
156
|
-
<td>The libraries for
|
153
|
+
<td>The libraries for a server are being installed.</td>
|
154
|
+
</tr>
|
155
|
+
<tr>
|
156
|
+
<td>initialize_app_environment</td>
|
157
|
+
<td>
|
158
|
+
The envrionment variables for the app-dependencies image are being set.
|
159
|
+
</td>
|
157
160
|
</tr>
|
158
161
|
<tr>
|
159
162
|
<td>create_databases</td>
|
@@ -163,6 +166,17 @@ These are the event types that you can hook into:
|
|
163
166
|
<td>load_database_seeds</td>
|
164
167
|
<td>The seed data for the app is being loaded on the database server.</td>
|
165
168
|
</tr>
|
169
|
+
<tr>
|
170
|
+
<td>add_project_landing</td>
|
171
|
+
<td>
|
172
|
+
We are adding the configuration for a project's landing page to a web
|
173
|
+
server.
|
174
|
+
</td>
|
175
|
+
</tr>
|
176
|
+
<tr>
|
177
|
+
<td>add_app_config</td>
|
178
|
+
<td>We are adding the configuration for a single app to a web server.</td>
|
179
|
+
</tr>
|
166
180
|
</table>
|
167
181
|
|
168
182
|
### Fields
|
@@ -177,20 +191,29 @@ The hook DSL allows you to set the following fields:
|
|
177
191
|
<th>Default</th>
|
178
192
|
</tr>
|
179
193
|
<tr>
|
180
|
-
<td>
|
181
|
-
<td>The name of the
|
182
|
-
<td><code>
|
194
|
+
<td>container_type</td>
|
195
|
+
<td>The name of the container type that this hook applies to</td>
|
196
|
+
<td><code>container_type :app</code></td>
|
183
197
|
<td>None; this is required</td>
|
184
198
|
</tr>
|
185
199
|
<tr>
|
186
|
-
<td>
|
187
|
-
<td>The
|
188
|
-
<td><code>
|
189
|
-
<td>
|
190
|
-
None; this is required. However, it can also be set by calling
|
191
|
-
`run_script`.
|
192
|
-
</td>
|
200
|
+
<td>app_server_type</td>
|
201
|
+
<td>The name of the app server type that this hook applies to</td>
|
202
|
+
<td><code>app_server_type :rails</code></td>
|
203
|
+
<td>all, meaning all app server types</td>
|
193
204
|
</tr>
|
205
|
+
<tr>
|
206
|
+
<td>database_server_type</td>
|
207
|
+
<td>The name of the database server type that this hook applies to</td>
|
208
|
+
<td><code>database_server_type :mysql</code></td>
|
209
|
+
<td>all, meaning all database server types</td>
|
210
|
+
</tr
|
211
|
+
<tr>
|
212
|
+
<td>web_server_type</td>
|
213
|
+
<td>The name of the web server type that this hook applies to</td>
|
214
|
+
<td><code>web_server_type :nginx</code></td>
|
215
|
+
<td>all, meaning all web server types</td>
|
216
|
+
</tr
|
194
217
|
<tr>
|
195
218
|
<td>script_folder</td>
|
196
219
|
<td>
|
@@ -200,6 +223,30 @@ The hook DSL allows you to set the following fields:
|
|
200
223
|
<td><code>script_folder './scripts'</code></td>
|
201
224
|
<td>The working directory</td>
|
202
225
|
</tr>
|
226
|
+
</table>
|
227
|
+
|
228
|
+
You can constrain a hook by multiple types of servers at once.. For instance,
|
229
|
+
you can set the app_server_type to :rails and the database_server_type to :mysql
|
230
|
+
to specify that the hook only applies to Rails apps backed by a MySQL database.
|
231
|
+
By default, hooks apply to all server types. You also have to specify the
|
232
|
+
container_type to say whether the hook is triggered by events on app images,
|
233
|
+
database images, or web server images. For instance,
|
234
|
+
both app images and database images have a `startup` event, and they'll need
|
235
|
+
different behaviors defined.
|
236
|
+
|
237
|
+
You can define the behaviors for the hooks with these methods:
|
238
|
+
|
239
|
+
<table>
|
240
|
+
<tr>
|
241
|
+
<th>Method Name</th>
|
242
|
+
<th>Description</th>
|
243
|
+
<th>Example</th>
|
244
|
+
</tr>
|
245
|
+
<tr>
|
246
|
+
<td>command</td>
|
247
|
+
<td>The shell command that should be run when the hook executes</td>
|
248
|
+
<td><code>command 'cp /var/docker/database.yml /var/code/config/'</code></td>
|
249
|
+
</tr>
|
203
250
|
<tr>
|
204
251
|
<td>copy_file</td>
|
205
252
|
<td>
|
@@ -207,7 +254,6 @@ The hook DSL allows you to set the following fields:
|
|
207
254
|
image. This is relative to the hook's script folder.
|
208
255
|
</td>
|
209
256
|
<td><code>copy_file 'setup.rb'</code></td>
|
210
|
-
<td>None, meaning that no files are copied for this hook.</td>
|
211
257
|
</tr>
|
212
258
|
<tr>
|
213
259
|
<td>run_script</td>
|
@@ -216,7 +262,20 @@ The hook DSL allows you to set the following fields:
|
|
216
262
|
will set the `copy_file` and the `command`.
|
217
263
|
</td>
|
218
264
|
<td><code>run_script 'setup.rb'</code></td>
|
219
|
-
|
265
|
+
</tr>
|
266
|
+
<tr>
|
267
|
+
<td>set_environment_variable</td>
|
268
|
+
<td>
|
269
|
+
This sets an environment variable in the image. The value can be set in
|
270
|
+
either a block or a literal value passed as the second parameter.
|
271
|
+
</td>
|
272
|
+
<td>
|
273
|
+
<code>
|
274
|
+
set_environment_variable 'RAILS_ENV' do
|
275
|
+
@project.rails_environment
|
276
|
+
end
|
277
|
+
</code>
|
278
|
+
</td>
|
220
279
|
</tr>
|
221
280
|
</table>
|
222
281
|
|
@@ -227,4 +286,5 @@ settings, so you can set defaults for them by calling `add_hooks`. This method
|
|
227
286
|
takes a hash containing options for the hooks, and a block for adding them. Any
|
228
287
|
hooks added in the block will have those options set.
|
229
288
|
|
230
|
-
The supported options are `script_folder
|
289
|
+
The supported options are `script_folder`, `app_server_type`,
|
290
|
+
`database_server_type`, `web_server_type`, and `container_type`.
|
data/lib/ruby_yacht/dsl/app.rb
CHANGED
@@ -22,13 +22,15 @@ module RubyYacht
|
|
22
22
|
# The name of the database that this app uses as its data store.
|
23
23
|
attr_accessor :database_name
|
24
24
|
|
25
|
+
# The project that includes this app.
|
26
|
+
def project
|
27
|
+
RubyYacht.configuration.projects.find { |project| project.apps.include?(self) }
|
28
|
+
end
|
29
|
+
|
25
30
|
# This method gets the name of the image / container that this app will run
|
26
31
|
# in.
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
# * *project: RubyYacht::Project* The project the app is running in.
|
31
|
-
def container_name(project)
|
32
|
+
def container_name
|
33
|
+
project = self.project
|
32
34
|
if project.system_prefix == self.name
|
33
35
|
return "#{project.system_prefix}"
|
34
36
|
else
|
@@ -38,13 +40,9 @@ module RubyYacht
|
|
38
40
|
|
39
41
|
# This method gets the database that the app connects to.
|
40
42
|
#
|
41
|
-
# ### Parameters
|
42
|
-
#
|
43
|
-
# * *project: RubyYacht::Project* The project the app is running in.
|
44
|
-
#
|
45
43
|
# ### Returns
|
46
44
|
# RubyYacht::Database
|
47
|
-
def database
|
45
|
+
def database
|
48
46
|
project.databases.find { |database| database.name == database_name }
|
49
47
|
end
|
50
48
|
|
@@ -61,10 +59,11 @@ module RubyYacht
|
|
61
59
|
#
|
62
60
|
# ### Parameters
|
63
61
|
#
|
64
|
-
# *
|
65
|
-
|
66
|
-
|
62
|
+
# * **server_type: Symbol** The type of server this is.
|
63
|
+
# * **name: String** The name of the app.
|
64
|
+
def initialize(server_type, name)
|
67
65
|
@server_type = server_type
|
66
|
+
@name = name.to_sym
|
68
67
|
load_custom_attributes
|
69
68
|
end
|
70
69
|
|
@@ -73,7 +72,7 @@ module RubyYacht
|
|
73
72
|
##
|
74
73
|
# :method: repository_name
|
75
74
|
# You can call `repository_name 'foo/bar'` to set the app's `repository_name`.
|
76
|
-
add_attribute :repository_name
|
75
|
+
add_attribute :repository_name, nil, false
|
77
76
|
|
78
77
|
##
|
79
78
|
# :method: database_name
|
@@ -102,10 +101,7 @@ module RubyYacht
|
|
102
101
|
# configuration.
|
103
102
|
def check_required_attributes
|
104
103
|
super
|
105
|
-
|
106
|
-
unless server_type && server_type.container_type == :app
|
107
|
-
raise "App has invalid server type `#{@server_type}`"
|
108
|
-
end
|
104
|
+
check_server_type @server_type, :app
|
109
105
|
end
|
110
106
|
end
|
111
107
|
end
|
@@ -17,6 +17,7 @@ module RubyYacht
|
|
17
17
|
@projects = []
|
18
18
|
@hooks = []
|
19
19
|
@server_types = []
|
20
|
+
@avoid_docker_machine = false
|
20
21
|
end
|
21
22
|
|
22
23
|
# The projects that are part of this system.
|
@@ -31,24 +32,51 @@ module RubyYacht
|
|
31
32
|
# Each entry is a Symbol.
|
32
33
|
attr_accessor :server_types
|
33
34
|
|
34
|
-
#
|
35
|
+
# Whether we should avoid using docker-machine even if it is installed.
|
35
36
|
#
|
36
|
-
#
|
37
|
-
#
|
37
|
+
# If docker-machine is not installed, the value of this flag will be
|
38
|
+
# ignored.
|
39
|
+
attr_accessor :disable_docker_machine
|
40
|
+
|
41
|
+
# This method pulls up the hooks that we have defined.
|
38
42
|
#
|
39
43
|
# ### Parameters
|
40
44
|
#
|
41
|
-
# * **
|
42
|
-
#
|
45
|
+
# * **server: App/Database**: The server we are fetching hooks for.
|
46
|
+
# * **event_type: Symbol**: The event that we are fetching hooks for.
|
43
47
|
#
|
44
48
|
# ### Returns
|
45
49
|
#
|
46
50
|
# The matching hooks. This will be an Array where each item is a Hook.
|
47
|
-
def fetch_hooks(
|
51
|
+
def fetch_hooks(server, event_type)
|
52
|
+
case server
|
53
|
+
when App
|
54
|
+
app_types = [server.server_type,:all]
|
55
|
+
database_types = [:all]
|
56
|
+
database = server.database
|
57
|
+
database_types << database.server_type if database
|
58
|
+
web_server_types = [:all] + server.project.web_servers.map(&:server_type).uniq
|
59
|
+
container_type = :app
|
60
|
+
when Database
|
61
|
+
database_types = [server.server_type, :all]
|
62
|
+
app_types = [:all]
|
63
|
+
app_types += server.apps.map(&:server_type)
|
64
|
+
web_server_types = [:all] + server.project.web_servers.map(&:server_type).uniq
|
65
|
+
container_type = :database
|
66
|
+
when WebServer
|
67
|
+
app_types = [:all] + server.project.apps.map(&:server_type).uniq
|
68
|
+
database_types = [:all] + server.project.databases.map(&:server_type).uniq
|
69
|
+
web_server_types = [:all, server.server_type]
|
70
|
+
container_type = :web
|
71
|
+
else
|
72
|
+
return []
|
73
|
+
end
|
48
74
|
self.hooks.select do |hook|
|
49
|
-
|
50
|
-
hook.
|
51
|
-
|
75
|
+
hook.event_type == event_type &&
|
76
|
+
app_types.include?(hook.app_server_type) &&
|
77
|
+
database_types.include?(hook.database_server_type) &&
|
78
|
+
web_server_types.include?(hook.web_server_type) &&
|
79
|
+
hook.container_type == container_type
|
52
80
|
end
|
53
81
|
end
|
54
82
|
|
@@ -73,6 +101,7 @@ module RubyYacht
|
|
73
101
|
# This initializer creates an empty configuration DSL.
|
74
102
|
def initialize
|
75
103
|
self.load_custom_attributes
|
104
|
+
@hook_options = {}
|
76
105
|
end
|
77
106
|
|
78
107
|
##
|
@@ -105,34 +134,24 @@ module RubyYacht
|
|
105
134
|
# RubyYacht::ServerType::DSL.
|
106
135
|
add_object_list :server_type, RubyYacht::ServerType::DSL
|
107
136
|
|
108
|
-
# The
|
109
|
-
attr_accessor :
|
110
|
-
|
111
|
-
# The app type for hooks that we are defining in the current block.
|
112
|
-
attr_accessor :hook_server_type
|
137
|
+
# The default options for the hooks we're defining in the current block.
|
138
|
+
attr_accessor :hook_options
|
113
139
|
|
114
140
|
# This method sets default attributes for a group of hooks.
|
115
141
|
#
|
116
|
-
# Any hooks that you create in the associated block will have
|
117
|
-
#
|
142
|
+
# Any hooks that you create in the associated block will have the included
|
143
|
+
# options set on them automatically. You will also be able to override
|
144
|
+
# these options in the configuration blocks for individual hooks.
|
118
145
|
#
|
119
146
|
# ### Parameters
|
120
147
|
#
|
121
|
-
# * **
|
148
|
+
# * **options: Hash** The fields to set on the hooks.
|
122
149
|
# * **block** A block for adding the hooks.
|
123
150
|
def add_hooks(options = {}, &block)
|
124
|
-
|
125
|
-
|
126
|
-
keys.each do |key|
|
127
|
-
old_options[key] = self.send("hook_#{key}")
|
128
|
-
self.send("hook_#{key}=", options[key]) if options.has_key?(key)
|
129
|
-
end
|
130
|
-
|
151
|
+
old_options = hook_options.dup
|
152
|
+
self.hook_options = options
|
131
153
|
block.call
|
132
|
-
|
133
|
-
keys.each do |key|
|
134
|
-
self.send("hook_#{key}=", old_options[key])
|
135
|
-
end
|
154
|
+
self.hook_options = old_options
|
136
155
|
end
|
137
156
|
|
138
157
|
# This method adds a before hook.
|
@@ -179,11 +198,11 @@ module RubyYacht
|
|
179
198
|
private
|
180
199
|
|
181
200
|
def add_hook(event_time, event_type, &block)
|
182
|
-
|
183
|
-
type = hook_server_type
|
201
|
+
hook_options = self.hook_options
|
184
202
|
hook event_time, event_type do
|
185
|
-
|
186
|
-
|
203
|
+
hook_options.each do |key, value|
|
204
|
+
public_send(key, value)
|
205
|
+
end
|
187
206
|
instance_eval(&block)
|
188
207
|
end
|
189
208
|
end
|
@@ -17,6 +17,9 @@ module RubyYacht
|
|
17
17
|
|
18
18
|
# The password we use to connect to the database
|
19
19
|
attr_accessor :password
|
20
|
+
|
21
|
+
# The port the database server should listen on.
|
22
|
+
attr_accessor :port
|
20
23
|
|
21
24
|
# The database-specific part of the container name for this database.
|
22
25
|
attr_accessor :container_label
|
@@ -26,11 +29,21 @@ module RubyYacht
|
|
26
29
|
host == 'localhost'
|
27
30
|
end
|
28
31
|
|
32
|
+
# The project that contains this database.
|
33
|
+
def project
|
34
|
+
RubyYacht.configuration.projects.find { |project| project.databases.include?(self) }
|
35
|
+
end
|
36
|
+
|
37
|
+
# The apps that connect to this database.
|
38
|
+
def apps
|
39
|
+
project.apps.select { |app| app.database_name == self.name }
|
40
|
+
end
|
41
|
+
|
29
42
|
# This method gets the name of the container and image for this database.
|
30
43
|
#
|
31
44
|
# This will be the project's prefix followed by the database's container
|
32
45
|
# label.
|
33
|
-
def container_name
|
46
|
+
def container_name
|
34
47
|
"#{project.system_prefix}-#{container_label}"
|
35
48
|
end
|
36
49
|
|
@@ -46,11 +59,11 @@ module RubyYacht
|
|
46
59
|
#
|
47
60
|
# ### Parameters
|
48
61
|
#
|
62
|
+
# * **server_type: Symbol** The type of database this is.
|
49
63
|
# * **name: String** The name of the database.
|
50
|
-
|
51
|
-
def initialize(name, server_type = nil)
|
52
|
-
@name = name
|
64
|
+
def initialize(server_type, name)
|
53
65
|
@server_type = server_type
|
66
|
+
@name = name.to_sym
|
54
67
|
load_custom_attributes
|
55
68
|
end
|
56
69
|
|
@@ -83,6 +96,12 @@ module RubyYacht
|
|
83
96
|
# password `testpass`.
|
84
97
|
add_attribute :password
|
85
98
|
|
99
|
+
##
|
100
|
+
# :method: port
|
101
|
+
# You can call `port 1234` to tell the database server to listen on port
|
102
|
+
# 1234.
|
103
|
+
add_attribute :port
|
104
|
+
|
86
105
|
##
|
87
106
|
# :method: container_label
|
88
107
|
# You can call `container_label 'mysql'` to give this database a container
|
@@ -100,10 +119,7 @@ module RubyYacht
|
|
100
119
|
# configuration.
|
101
120
|
def check_required_attributes
|
102
121
|
super
|
103
|
-
|
104
|
-
unless server_type && server_type.container_type == :database
|
105
|
-
raise "Database has invalid server type `#{@server_type}`"
|
106
|
-
end
|
122
|
+
check_server_type @server_type, :database
|
107
123
|
end
|
108
124
|
end
|
109
125
|
end
|
data/lib/ruby_yacht/dsl/dsl.rb
CHANGED
@@ -164,9 +164,7 @@ module RubyYacht
|
|
164
164
|
variable_name = "@#{name}s"
|
165
165
|
list = instance_variable_get(variable_name)
|
166
166
|
object_config = type.new(*args)
|
167
|
-
|
168
|
-
object_config.run(config_block)
|
169
|
-
end
|
167
|
+
object_config.run(config_block)
|
170
168
|
value = object_config.create_object
|
171
169
|
list << value
|
172
170
|
instance_variable_set(variable_name, list)
|
@@ -276,7 +274,20 @@ module RubyYacht
|
|
276
274
|
end
|
277
275
|
instance_variable_set("@#{name}", copy)
|
278
276
|
end
|
279
|
-
|
277
|
+
if block
|
278
|
+
instance_eval(&block)
|
279
|
+
end
|
280
|
+
|
281
|
+
type = RubyYacht.configuration.find_server_type(@server_type)
|
282
|
+
if type
|
283
|
+
type.server_defaults.each do |server_defaults|
|
284
|
+
server_defaults.each do |key, value|
|
285
|
+
if instance_variable_get("@#{key}") == nil
|
286
|
+
instance_variable_set("@#{key}", value)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
280
291
|
self
|
281
292
|
end
|
282
293
|
|
@@ -293,6 +304,23 @@ module RubyYacht
|
|
293
304
|
end
|
294
305
|
end
|
295
306
|
end
|
307
|
+
|
308
|
+
# This method checks that a server type has been registered.
|
309
|
+
#
|
310
|
+
# If it has not, this will raise an exception.
|
311
|
+
#
|
312
|
+
# ### Parameters
|
313
|
+
#
|
314
|
+
# * **server_type: Symbol** The server type that has been set on this
|
315
|
+
# DSL instance.
|
316
|
+
# * **container_type: Symbol** The container type that the server type
|
317
|
+
# must be registered for.
|
318
|
+
def check_server_type(server_type, container_type)
|
319
|
+
result = RubyYacht.configuration.find_server_type(server_type)
|
320
|
+
unless result && result.container_type == container_type
|
321
|
+
raise "#{self.class.name} has invalid #{container_type} server type `#{server_type}`"
|
322
|
+
end
|
323
|
+
end
|
296
324
|
|
297
325
|
# This method creates an object with the attributes from this instance.
|
298
326
|
#
|