isolated_database_service 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f69d9eba61fc64b014c0f00bb85ab7e590a4f99
4
- data.tar.gz: 56232793ed16b8a5083c5c5a87ca469765743202
3
+ metadata.gz: 1e5fca6a1b29b5e97e554dfcf83370d07c23c784
4
+ data.tar.gz: 82e9c72fe4f16324ba99672f93371b7f2b4590c2
5
5
  SHA512:
6
- metadata.gz: 11ed5b0c6a2612d90c8affde99d991a5738b999eee3fbc9c87f7d41366447e1d051c16608491892ac16226908e2dae921f8cbfe4aa5d8e46fab447ba3de1f1a6
7
- data.tar.gz: d3ce9c37fa8524f9b91dfa53fe8d64773abc36cd85da26fb21ded84ba7cc6c28c1289a3f2bd573366b1b92bf725b6e556531b5a0789e22c7e70dd9f8108ad41a
6
+ metadata.gz: 468492c226c9d0cad72c812009872e978f509779085312ebff00bd0a29409e1ca8c968e61fd2063188e96914e25f87948fc885ff412958fe029099572a837510
7
+ data.tar.gz: f21529437f58dcfe91b516dcf0acfe95f162eb9e3e4fa76b04e14d5b82658a0e979160dc1fe6c639457b65b67dcdb88aae4eb6219301e5e08e71c8ace0e8cc2e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- isolated_database_service (0.0.3)
4
+ isolated_database_service (0.0.4)
5
5
  isolated_server
6
6
  mysql2
7
7
  rack-parser
@@ -14,7 +14,7 @@ GEM
14
14
  backports (3.6.7)
15
15
  bump (0.5.3)
16
16
  diff-lcs (1.2.5)
17
- isolated_server (0.4.7)
17
+ isolated_server (0.4.9)
18
18
  multi_json (1.11.2)
19
19
  mysql2 (0.4.2)
20
20
  rack (1.6.4)
data/README.md CHANGED
@@ -164,3 +164,49 @@ curl -X DELETE http://localhost:9292/servers/2
164
164
  ```http
165
165
  204 No Content
166
166
  ```
167
+
168
+ ### Boot MySQL Cluster
169
+ `POST /mysql-clusters`
170
+
171
+ Creates a cluster of MySQL servers with a master, a slave and a chained slave server, with replication established.
172
+
173
+ The optional `initial_sql` property contains an array of SQL statements to execute on the master server before establishing replication.
174
+
175
+ #### Using curl
176
+
177
+ ```bash
178
+ curl -H "Content-Type: application/json" \
179
+ -d '{"cluster":{"initial_sql":[
180
+ "CREATE TABLE test.foo (id INT, value INT)"
181
+ "INSERT INTO test.foo VALUES (1, 2)"]}}' \
182
+ -X POST http://localhost:9000/mysql-clusters
183
+ ```
184
+
185
+ #### Example Response
186
+
187
+ ```http
188
+ 200 OK
189
+
190
+ {
191
+ "cluster": {
192
+ "master": {
193
+ "id": 1,
194
+ "port": 57959,
195
+ "up": true,
196
+ "type": "mysql"
197
+ },
198
+ "slave": {
199
+ "id": 2,
200
+ "port": 27702,
201
+ "up": true,
202
+ "type": "mysql"
203
+ },
204
+ "slave_2": {
205
+ "id": 3,
206
+ "port": 51111,
207
+ "up": true,
208
+ "type": "mysql"
209
+ }
210
+ }
211
+ }
212
+ ```
@@ -5,6 +5,7 @@ require 'json'
5
5
  require 'isolated_server'
6
6
  require 'isolated_server/mysql'
7
7
  require 'isolated_server/mongodb'
8
+ require 'isolated_database_service/boot_mysql_cluster'
8
9
 
9
10
  module IsolatedDatabaseService
10
11
  class ServerList
@@ -60,6 +61,24 @@ module IsolatedDatabaseService
60
61
  json :server => present_server(id, new_server)
61
62
  end
62
63
 
64
+ post '/mysql-clusters' do
65
+ halt(400) unless params[:cluster]
66
+
67
+ initial_sql = params[:cluster][:initial_sql] || []
68
+ mysql_master, mysql_slave, mysql_slave_2 = BootMysqlCluster::boot!(initial_sql)
69
+
70
+ mysql_master_id = servers.add_server(mysql_master)
71
+ mysql_slave_id = servers.add_server(mysql_slave)
72
+ mysql_slave_2_id = servers.add_server(mysql_slave_2)
73
+
74
+ status 201
75
+ json :cluster => {
76
+ master: present_server(mysql_master_id, mysql_master),
77
+ slave: present_server(mysql_slave_id, mysql_slave),
78
+ slave_2: present_server(mysql_slave_2_id, mysql_slave_2),
79
+ }
80
+ end
81
+
63
82
  get '/servers' do
64
83
  json :servers => servers.servers.map { |id, server| present_server(id, server) }
65
84
  end
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'isolated_server'
4
+ require 'isolated_server/mysql'
5
+
6
+ # This is based on https://github.com/osheroff/ar_mysql_flexmaster/blob/master/test/boot_mysql_env.rb
7
+ module BootMysqlCluster
8
+ def self.boot!(initial_sql = [])
9
+ mysql_master = nil
10
+ mysql_slave = nil
11
+ mysql_slave_2 = nil
12
+
13
+ threads = []
14
+ threads << Thread.new do
15
+ mysql_master = IsolatedServer::Mysql.new(allow_output: false)
16
+ mysql_master.boot!
17
+ end
18
+
19
+ threads << Thread.new do
20
+ mysql_slave = IsolatedServer::Mysql.new
21
+ mysql_slave.boot!
22
+ end
23
+
24
+ threads << Thread.new do
25
+ mysql_slave_2 = IsolatedServer::Mysql.new
26
+ mysql_slave_2.boot!
27
+ end
28
+
29
+ threads.each(&:join)
30
+
31
+ mysql_master.connection.query("CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_password=''")
32
+ mysql_slave.make_slave_of(mysql_master)
33
+ mysql_slave_2.make_slave_of(mysql_slave)
34
+
35
+ initial_sql.each do |sql|
36
+ mysql_master.connection.query(sql)
37
+ end
38
+ mysql_slave.set_rw(false)
39
+ mysql_slave_2.set_rw(false)
40
+
41
+ # let replication for the grants and such flow down. bleh.
42
+ repl_sync = false
43
+ while !repl_sync
44
+ repl_sync = [[mysql_master, mysql_slave], [mysql_slave, mysql_slave_2]].all? do |master, slave|
45
+ master_pos = master.connection.query("show master status").to_a.first["Position"]
46
+ slave.connection.query("show slave status").to_a.first["Exec_Master_Log_Pos"] == master_pos
47
+ end
48
+ sleep 1
49
+ end
50
+
51
+ [mysql_master, mysql_slave, mysql_slave_2]
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module IsolatedDatabaseService
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isolated_database_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Grossman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-03 00:00:00.000000000 Z
11
+ date: 2015-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -156,6 +156,7 @@ files:
156
156
  - config.ru
157
157
  - isolated_database_service.gemspec
158
158
  - lib/isolated_database_service.rb
159
+ - lib/isolated_database_service/boot_mysql_cluster.rb
159
160
  - lib/isolated_database_service/version.rb
160
161
  - spec/isolated_service_spec.rb
161
162
  - spec/spec_helper.rb