bricolage 5.27.2 → 5.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +22 -0
- data/Gemfile +2 -0
- data/LICENSES +21 -0
- data/RELEASE.md +271 -0
- data/Rakefile +3 -0
- data/bricolage.gemspec +26 -0
- data/jobclass/exec.rb +5 -2
- data/lib/bricolage/configloader.rb +12 -10
- data/lib/bricolage/datasource.rb +16 -11
- data/lib/bricolage/job.rb +3 -0
- data/lib/bricolage/jobfile.rb +42 -6
- data/lib/bricolage/parameters.rb +6 -2
- data/lib/bricolage/version.rb +1 -1
- data/streaming_load_log.ct +9 -0
- metadata +11 -143
- data/test/all.rb +0 -3
- data/test/home/Gemfile +0 -3
- data/test/home/Gemfile.lock +0 -44
- data/test/home/config/bricolage.yml +0 -1
- data/test/home/config/development/database.yml +0 -100
- data/test/home/config/development/password.yml +0 -6
- data/test/home/config/development/variable.yml +0 -7
- data/test/home/data/20141002-1355_00.txt +0 -2
- data/test/home/data/20141002-1355_01.txt +0 -2
- data/test/home/data/20141002-1355_02.txt +0 -2
- data/test/home/data/test.txt +0 -1
- data/test/home/jobnet-test.rb +0 -61
- data/test/home/log/20170117/subsys::job1/20170117_202014082/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::job1/20170117_202334852/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::job1/20170117_202405056/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::migrate/20170117_202548409/subsys-migrate.log +0 -80
- data/test/home/log/20170117/subsys::migrate/20170117_202636115/subsys-migrate.log +0 -79
- data/test/home/log/20170117/subsys::net1/20170117_203022461/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203022461/subsys-job2.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203022461/subsys-job3.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203022461/subsys-job4.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203102130/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203102130/subsys-job2.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203102130/subsys-job3.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203102130/subsys-job4.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203232033/subsys-job1.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203232033/subsys-job2.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203232033/subsys-job3.log +0 -3
- data/test/home/log/20170117/subsys::net1/20170117_203232033/subsys-job4.log +0 -3
- data/test/home/log/20170629/subsys::job1/20170629_155543985/subsys-job1.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_154308811/subsys-job1.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_154308811/subsys-job2.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_154308811/subsys-job3.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_154308811/subsys-job4.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_155330208/subsys-job1.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_155330208/subsys-job2.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_155330208/subsys-job3.log +0 -3
- data/test/home/log/20170629/subsys::net1/20170629_155330208/subsys-job4.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145523511/subsys-job1.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145523511/subsys-job2.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145523511/subsys-job3.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145523511/subsys-job4.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145545097/subsys-job1.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145545097/subsys-job2.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145545097/subsys-job3.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145545097/subsys-job4.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145615702/subsys-job1.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145615702/subsys-job2.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145615702/subsys-job3.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_145615702/subsys-job4.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_153437221/subsys-job1.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_153507519/subsys-job1.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_153507519/subsys-job2.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_153507519/subsys-job3.log +0 -3
- data/test/home/log/20170630/subsys::net1/20170630_153507519/subsys-job4.log +0 -3
- data/test/home/log/20170704/subsys::insert/20170704_164335210/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert/20170704_164344251/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert/20170704_164723299/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert.sql/20170704_164143661/subsys-insert.sql.log +0 -14
- data/test/home/log/20170704/subsys::insert.sql.job/20170704_163033119/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert.sql.job/20170704_172410576/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert.sql.job/20170704_173130175/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::insert.sql.job/20170704_173201376/subsys-insert.log +0 -14
- data/test/home/log/20170704/subsys::net1/20170704_162457694/subsys-job1.log +0 -3
- data/test/home/log/20170704/subsys::net1/20170704_162544282/subsys-job1.log +0 -3
- data/test/home/log/20170704/subsys::net1/20170704_162544282/subsys-job2.log +0 -3
- data/test/home/log/20170704/subsys::net1/20170704_162544282/subsys-job3.log +0 -3
- data/test/home/log/20170704/subsys::net1/20170704_162544282/subsys-job4.log +0 -3
- data/test/home/log/20170706/subsys::net1/20170706_201157129/subsys-job1.log +0 -3
- data/test/home/log/20170706/subsys::net1/20170706_201157129/subsys-job2.log +0 -3
- data/test/home/log/20170706/subsys::net1/20170706_201157129/subsys-job3.log +0 -3
- data/test/home/log/20170706/subsys::net1/20170706_201157129/subsys-job4.log +0 -3
- data/test/home/log/20170707/subsys::insert/20170707_020050817/subsys-insert.log +0 -51
- data/test/home/log/20170707/subsys::insert/20170707_020050817/subsys-insert.log.status +0 -1
- data/test/home/log/20170707/subsys::job1/20170707_020542902/subsys-job1.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_012252058/subsys-job1.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_012252058/subsys-job2.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_012252058/subsys-job3.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_012252058/subsys-job4.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_020039222/subsys-job1.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_020039222/subsys-job2.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_020039222/subsys-job3.log +0 -3
- data/test/home/log/20170707/subsys::net1/20170707_020039222/subsys-job4.log +0 -3
- data/test/home/revert.sh +0 -7
- data/test/home/s +0 -1
- data/test/home/subsys/d.ct +0 -7
- data/test/home/subsys/insert.sql.job +0 -7
- data/test/home/subsys/item_pv_acc.ct +0 -8
- data/test/home/subsys/job1.job +0 -1
- data/test/home/subsys/job2.job +0 -1
- data/test/home/subsys/job3.job +0 -1
- data/test/home/subsys/job4.job +0 -1
- data/test/home/subsys/job5.job +0 -1
- data/test/home/subsys/job6.job +0 -1
- data/test/home/subsys/job7.job +0 -1
- data/test/home/subsys/load.job +0 -9
- data/test/home/subsys/load_test.ct +0 -6
- data/test/home/subsys/load_test.job +0 -14
- data/test/home/subsys/migrate.job +0 -33
- data/test/home/subsys/my-import-delta.sql.job +0 -40
- data/test/home/subsys/my-import.job +0 -31
- data/test/home/subsys/net1.jobnet +0 -3
- data/test/home/subsys/net2.jobnet +0 -2
- data/test/home/subsys/put.job +0 -3
- data/test/home/subsys/raw-vacuum.jobnet +0 -1
- data/test/home/subsys/raw-vacuum.sql.job +0 -7
- data/test/home/subsys/rebuild.sql.job +0 -14
- data/test/home/subsys/redis_export.job +0 -9
- data/test/home/subsys/redis_export2.job +0 -8
- data/test/home/subsys/search_backends.ct +0 -13
- data/test/home/subsys/separated.job +0 -1
- data/test/home/subsys/separated.sql +0 -1
- data/test/home/subsys/some_view-cv.sql.job +0 -11
- data/test/home/subsys/unified.jobnet +0 -1
- data/test/home/subsys/unified.sql.job +0 -5
- data/test/home/subsys/users.ct +0 -13
- data/test/home/subsys/variable.yml +0 -6
- data/test/test_c_streaming_load.rb +0 -13
- data/test/test_filesystem.rb +0 -19
- data/test/test_logfilepath.rb +0 -19
- data/test/test_parameters.rb +0 -401
- data/test/test_psqldatasource.rb +0 -12
- data/test/test_s3datasource.rb +0 -40
- data/test/test_variables.rb +0 -114
- data/test/vacuum-test.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3d6d789d6f3c437f1e3e9df962f92db5c7aac168952d633b72be38023d875c1
|
4
|
+
data.tar.gz: adbca861a3b9f811a22338422167f8945ba3d3894bfde294875ccb22c38e1a80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88a618757a3747efc8e846bb217c382044348b56f64e7f02c67f0e9e64c08fe56534ed4b282542a6639b07417dad40ac4c0a0afe78b14a273944c12d15ec1abf
|
7
|
+
data.tar.gz: a2ee05a0200bd069ff057b98d2bac2640d2dc9f2a984f90f50f844ebab07097961877038c3a7627f8d2adf641ca5b75c24ede6c5f024e959980782e8b7ebc63e
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
coverage
|
6
|
+
InstalledFiles
|
7
|
+
lib/bundler/man
|
8
|
+
pkg
|
9
|
+
rdoc
|
10
|
+
spec/reports
|
11
|
+
test/tmp
|
12
|
+
test/version_tmp
|
13
|
+
tmp
|
14
|
+
|
15
|
+
# YARD artifacts
|
16
|
+
.yardoc
|
17
|
+
_yardoc
|
18
|
+
doc/
|
19
|
+
|
20
|
+
/dev
|
21
|
+
/test/home/config
|
22
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/LICENSES
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2015-2018 Minero Aoki
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/RELEASE.md
ADDED
@@ -0,0 +1,271 @@
|
|
1
|
+
# Bricolage Release Note
|
2
|
+
|
3
|
+
## version 5.28.0
|
4
|
+
|
5
|
+
- [new] bricolage command now accepts .rb.job, .py.job, .sh.job as a script-embedded job.
|
6
|
+
- [new] new data sources file "datasource.yml", in addition to database.yml. Users can continue to use database.yml, this does NOT introduce any incompatibility.
|
7
|
+
- [new] exec: New option "env" to set additional environment variables.
|
8
|
+
- [new] exec: Accepts single string value for args.
|
9
|
+
|
10
|
+
## version 5.27.2
|
11
|
+
|
12
|
+
- [fix] Supports `encoding` load option.
|
13
|
+
|
14
|
+
## version 5.27.1
|
15
|
+
|
16
|
+
- [fix] SNS data source did not work.
|
17
|
+
|
18
|
+
## version 5.27.0
|
19
|
+
|
20
|
+
- [new] New option --disable-queue, to disable job queue explicitly. This option overrides enable-queue option in bricolage.yml.
|
21
|
+
- [new] New option --clear-queue, to clear job queue.
|
22
|
+
|
23
|
+
## version 5.26.0
|
24
|
+
|
25
|
+
- [CHANGE] MySQL or Redis related job classes are separated into other gems, bricolage-mysql and bricolage-redis.
|
26
|
+
Use those gems if you need them.
|
27
|
+
|
28
|
+
## version 5.25.1
|
29
|
+
|
30
|
+
- [fix] Adds dependency to aws-sdk-sns.
|
31
|
+
|
32
|
+
## version 5.25.0
|
33
|
+
|
34
|
+
- Upgrade aws-sdk to v3 (aws-sdk-s3 v1).
|
35
|
+
|
36
|
+
## version 5.24.6
|
37
|
+
|
38
|
+
- [fix] __FILE__ or __dir__ was not correct in config/prelude.rb.
|
39
|
+
|
40
|
+
## version 5.24.5
|
41
|
+
|
42
|
+
- (skipped)
|
43
|
+
|
44
|
+
## version 5.24.4
|
45
|
+
|
46
|
+
- Improve error message with my-import job failure
|
47
|
+
|
48
|
+
## version 5.24.3
|
49
|
+
|
50
|
+
- Support ECS task role with my-import job class
|
51
|
+
|
52
|
+
## version 5.24.2
|
53
|
+
|
54
|
+
- [fix] --log-dir, --log-path and --s3-log options are wrongly not ommittable
|
55
|
+
|
56
|
+
## version 5.24.1
|
57
|
+
|
58
|
+
- [fix] --enable-queue did not work
|
59
|
+
|
60
|
+
## version 5.24.0
|
61
|
+
|
62
|
+
- [new] New config file config/bricolage.yml to save command line options in the file.
|
63
|
+
- [new] New option --s3-log to upload log files to S3.
|
64
|
+
- [fix] Strips ".sql" from job ID, when the job is executed via *.sql.job file.
|
65
|
+
- [fix] Strips all file extensions from jobnet ID, including ".job" or ".sql.job".
|
66
|
+
|
67
|
+
## version 5.23.3
|
68
|
+
|
69
|
+
- [fix] mys3dump creates empty object even though if source table has no records.
|
70
|
+
|
71
|
+
## version 5.23.2
|
72
|
+
|
73
|
+
- [new] new job class: adhoc.
|
74
|
+
This job class have only one parameter, sql-file, so instance jobs are never affected by
|
75
|
+
defaults value such as analyze or grant.
|
76
|
+
|
77
|
+
## version 5.23.1
|
78
|
+
|
79
|
+
- [new] streaming_load: new option --skip-work
|
80
|
+
|
81
|
+
## version 5.23.0
|
82
|
+
|
83
|
+
- [CHANGE] Drops TD data source support from core. Use separated bricolage-td gem.
|
84
|
+
|
85
|
+
## version 5.22.3
|
86
|
+
|
87
|
+
- [new] load, insert: Reduces the number of transactions.
|
88
|
+
|
89
|
+
## version 5.22.2
|
90
|
+
|
91
|
+
- [new] new option -Q, -L
|
92
|
+
|
93
|
+
## version 5.22.1
|
94
|
+
|
95
|
+
- [new] bricolage-jobnet: new options --enable-queue and --local-state-dir, for auto-named job queue.
|
96
|
+
|
97
|
+
## version 5.22.0
|
98
|
+
|
99
|
+
- [new] bricolage: new option --log-path.
|
100
|
+
- [new] bricolage, bricolage-jobnet: new option --log-dir.
|
101
|
+
- [new] bricolage, bricolage-jobnet: new env BRICOLAGE_LOG_PATH.
|
102
|
+
- [new] bricolage, bricolage-jobnet: new env BRICOLAGE_LOG_DIR.
|
103
|
+
|
104
|
+
## version 5.21.0
|
105
|
+
|
106
|
+
- [new] bricolage-jobnet command accepts .job file as a single job jobnet.
|
107
|
+
|
108
|
+
## version 5.20.5
|
109
|
+
|
110
|
+
- [fix] my-migrate, my-import: Do not exposure passwords in command line arguments or log files.
|
111
|
+
|
112
|
+
## version 5.20.4
|
113
|
+
|
114
|
+
- [fix] my-migrate, my-import: should not drop old tables in the RENAME transaction, to avoid "table dropped by concurrent transaction" error.
|
115
|
+
|
116
|
+
## version 5.20.3
|
117
|
+
|
118
|
+
- [new] mysql data source: new option "collation".
|
119
|
+
|
120
|
+
## version 5.20.2
|
121
|
+
|
122
|
+
- [fix] AWS S3 API ListObjectsV2 may return corrupted XML, retry it
|
123
|
+
|
124
|
+
## version 5.20.1
|
125
|
+
|
126
|
+
- [new] new job class my-import-delta.
|
127
|
+
|
128
|
+
## version 5.20.0
|
129
|
+
|
130
|
+
- [new] streaming_load: Reduces the number of transaction.
|
131
|
+
|
132
|
+
## version 5.19.1
|
133
|
+
|
134
|
+
- [new] streaming_load: new option --ctl-prefix and --keep-ctl (both is optional).
|
135
|
+
|
136
|
+
## version 5.19.0
|
137
|
+
|
138
|
+
- [new] bricolage, bricolage-jobnet, Bricolage::CommandLineApplication now do not block on executing queries in PostgreSQL-like DBs (including Redshift).
|
139
|
+
- [CHANGE] Removes (maybe) unused method PostgresConnection#streaming_execute_query. Use #query_batch instead.
|
140
|
+
|
141
|
+
## version 5.18.1
|
142
|
+
|
143
|
+
- new class SNSDataSource.
|
144
|
+
- new class NullLogger.
|
145
|
+
- new exception S3Exception.
|
146
|
+
- new exception SNSException.
|
147
|
+
|
148
|
+
## version 5.18.0
|
149
|
+
|
150
|
+
- [new] New parameter "no-backup" for my-import and my-migrate job classes.
|
151
|
+
- [new] New parameter "sql_log_level" for the psql data source.
|
152
|
+
- [new] Shows SQL source location before the query.
|
153
|
+
- Raises ConnectionError for all connection-level problems, while it raises SQLError for SQL-level errors.
|
154
|
+
|
155
|
+
## version 5.17.2
|
156
|
+
|
157
|
+
- [fix] Using CommandLineApplication with --environment option causes unexpected option error
|
158
|
+
|
159
|
+
## version 5.17.1
|
160
|
+
|
161
|
+
- [fix] --dry-run option did not work for my-import job class.
|
162
|
+
- [new] AWS access key id & secret key are now optional for S3 data sources (to allow using EC2 instance or ECS task attached IAM role)
|
163
|
+
|
164
|
+
## version 5.17.0
|
165
|
+
|
166
|
+
- [new] Supports Redshift attached IAM role for COPY and UNLOAD.
|
167
|
+
|
168
|
+
## version 5.16.9
|
169
|
+
|
170
|
+
- code-level change only: [new] new method Transaction#truncate_and_commit
|
171
|
+
|
172
|
+
## version 5.16.8
|
173
|
+
|
174
|
+
- code-level change only
|
175
|
+
|
176
|
+
## version 5.16.7
|
177
|
+
|
178
|
+
- [fix] require 'bricolage/context' wrongly caused NameError.
|
179
|
+
- [new] PostgresConnection#drop_table_force utilizes DROP TABLE IF EXISTS.
|
180
|
+
|
181
|
+
## version 5.16.6
|
182
|
+
|
183
|
+
- rebuild-rename, rebuild-drop, my-import, my-migrate, create, createview: Reduces the number of transactions for speed.
|
184
|
+
|
185
|
+
## version 5.16.5
|
186
|
+
|
187
|
+
- [fix] my-import: mys3dump: Fixes buffer size problem.
|
188
|
+
- [fix] my-import: mys3dump: Escapes more meta characters (e.g. \n, \r, \v, ...).
|
189
|
+
|
190
|
+
## version 5.16.4
|
191
|
+
|
192
|
+
- [fix] Adds dependency to rake
|
193
|
+
- [fix] my-import: Reduces warning log messages.
|
194
|
+
|
195
|
+
## version 5.16.3
|
196
|
+
|
197
|
+
- [fix] streaming_load: Disables statupdate for log staging table, it is useless.
|
198
|
+
|
199
|
+
## version 5.16.2
|
200
|
+
|
201
|
+
- [fix] streaming_load: Disables compupdate on COPY. This *might* cause Assert error on some clusters.
|
202
|
+
|
203
|
+
## version 5.16.1
|
204
|
+
|
205
|
+
- [fix] Fixes syntax error on ruby 2.1
|
206
|
+
|
207
|
+
## version 5.16.0
|
208
|
+
|
209
|
+
- [CHANGE][EXPERIMENTAL] streaming_load: Always reuse same temporary log table xxxx_l_wk instead of temporary xxxx_l_tmpNNNN. This *might* cause Redshift DDL slow down, I try to reduce the number of drop-create.
|
210
|
+
|
211
|
+
## version 5.15.2
|
212
|
+
|
213
|
+
- [fix] redis-export: remove un-required error check.
|
214
|
+
|
215
|
+
## version 5.15.1
|
216
|
+
|
217
|
+
- [new] redis-export: make faster using cursor and Redis pipeline.
|
218
|
+
|
219
|
+
## version 5.15.0
|
220
|
+
|
221
|
+
- [new][EXPERIMENTAL] new job class redis-export.
|
222
|
+
|
223
|
+
## version 5.14.0
|
224
|
+
|
225
|
+
- [new] streaming_load: Fast log check by temporary load log table.
|
226
|
+
- [new] streaming_load: Ignores all S3 key-does-not-exist errors; they are caused by S3 eventual consistency.
|
227
|
+
|
228
|
+
## version 5.13.1
|
229
|
+
|
230
|
+
- [fix] load, streaming_load: "encrypted" load option should not be used for SSE-KMS
|
231
|
+
|
232
|
+
## version 5.13.0
|
233
|
+
|
234
|
+
- [new] streaming_load: Supports S3 server-side encryption with AWS KMS (Key Management Service).
|
235
|
+
- Now Bricolage requires Ruby AWS-SDK v2 for AWS signature v4.
|
236
|
+
|
237
|
+
## version 5.12.5
|
238
|
+
|
239
|
+
- [fix] Ruby 2.1 does not have Etc.uname, use uname command instead.
|
240
|
+
|
241
|
+
## version 5.12.4
|
242
|
+
|
243
|
+
- [new] Supports loading from encrypted S3 data source.
|
244
|
+
- [new] New job class "createview".
|
245
|
+
- [new] Now "create" and "sql" job class support "grant" parameter.
|
246
|
+
|
247
|
+
## version 5.12.3
|
248
|
+
|
249
|
+
- [new] my-migrate job class supports sql-file parameter for export.
|
250
|
+
|
251
|
+
## version 5.12.2
|
252
|
+
|
253
|
+
- [new] td-export job class supports .sql.job file
|
254
|
+
|
255
|
+
## version 5.12.1
|
256
|
+
|
257
|
+
- [fix] ensure unlocking VACUUM lock, also when VACUUM statement was failed.
|
258
|
+
|
259
|
+
## version 5.12.0
|
260
|
+
|
261
|
+
- [new] Introduces subsystem-wise variable file (SUBSYS/variable.yml)
|
262
|
+
- [new] Allows providing default options by "defaults" global variable (e.g. enabling "grant" option by default)
|
263
|
+
|
264
|
+
## version 5.11.0
|
265
|
+
|
266
|
+
- [fix] Supports jobnet which has both a job and a jobnet
|
267
|
+
|
268
|
+
## version 5.10.0
|
269
|
+
|
270
|
+
- streaming_load: new option --sql-file
|
271
|
+
|
data/Rakefile
ADDED
data/bricolage.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'lib/bricolage/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.name = 'bricolage'
|
6
|
+
s.version = Bricolage::VERSION
|
7
|
+
s.summary = 'SQL Batch Framework'
|
8
|
+
s.description = 'Redshift-oriented Data Warehouse Batch Framework'
|
9
|
+
s.license = 'MIT'
|
10
|
+
|
11
|
+
s.author = ['Minero Aoki']
|
12
|
+
s.email = 'aamine@loveruby.net'
|
13
|
+
s.homepage = 'https://github.com/bricolages/bricolage'
|
14
|
+
|
15
|
+
s.files = `git ls-files -z`.split("\x0").reject {|f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
s.executables = s.files.grep(%r{bin/}).map {|path| File.basename(path) }
|
17
|
+
s.require_path = 'lib'
|
18
|
+
|
19
|
+
s.required_ruby_version = '>= 2.0.0'
|
20
|
+
s.add_dependency 'pg', '~> 0.18.0'
|
21
|
+
s.add_dependency 'aws-sdk-s3', '~> 1'
|
22
|
+
s.add_dependency 'aws-sdk-sns', '~> 1'
|
23
|
+
s.add_development_dependency 'test-unit'
|
24
|
+
s.add_development_dependency 'rake'
|
25
|
+
s.add_development_dependency 'mocha'
|
26
|
+
end
|
data/jobclass/exec.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
JobClass.define('exec') {
|
2
2
|
parameters {|params|
|
3
|
-
params.add StringListParam.new('args', 'ARG', 'Command line arguments.')
|
3
|
+
params.add StringListParam.new('args', 'ARG', 'Command line arguments.', allow_string: true)
|
4
|
+
params.add KeyValuePairsParam.new('env', 'ENVS', 'Environment variables.')
|
4
5
|
}
|
5
6
|
|
6
7
|
script {|params, script|
|
7
8
|
script.task(params.generic_ds) {|task|
|
8
9
|
task.action(params['args'].join(' ')) {|ds|
|
9
10
|
ds.logger.info '[CMD] ' + params['args'].join(' ')
|
10
|
-
|
11
|
+
environ = params['env'] || {}
|
12
|
+
argv = params['args']
|
13
|
+
system(environ, *argv)
|
11
14
|
st = $?
|
12
15
|
ds.logger.info "status=#{st.exitstatus}"
|
13
16
|
JobResult.for_bool(st.exitstatus == 0)
|
@@ -16,11 +16,19 @@ module Bricolage
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def load_yaml(path)
|
19
|
-
parse_yaml(
|
19
|
+
parse_yaml(load_eruby(path), path)
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
eruby(
|
22
|
+
def load_eruby(path)
|
23
|
+
eruby(load_file(path), path)
|
24
|
+
end
|
25
|
+
|
26
|
+
alias load_text load_eruby # FIXME: obsolete
|
27
|
+
|
28
|
+
def load_file(path)
|
29
|
+
File.read(path)
|
30
|
+
rescue SystemCallError => err
|
31
|
+
raise ParameterError, "could not read file: #{err.message}"
|
24
32
|
end
|
25
33
|
|
26
34
|
def eruby(text, path)
|
@@ -39,12 +47,6 @@ module Bricolage
|
|
39
47
|
raise ParameterError, "#{path}: config file syntax error: #{err.message}"
|
40
48
|
end
|
41
49
|
|
42
|
-
def read_file(path)
|
43
|
-
File.read(path)
|
44
|
-
rescue SystemCallError => err
|
45
|
-
raise ParameterError, "could not read file: #{err.message}"
|
46
|
-
end
|
47
|
-
|
48
50
|
#
|
49
51
|
# For embedded code
|
50
52
|
#
|
@@ -71,7 +73,7 @@ module Bricolage
|
|
71
73
|
# $base_dir + "vars.yml" -> "$base_dir/vars.yml"
|
72
74
|
# $base_dir + "/abs/path/vars.yml" -> "/abs/path/vars.yml"
|
73
75
|
def read_config_file(path)
|
74
|
-
|
76
|
+
load_eruby(relative_path(Pathname(path)))
|
75
77
|
end
|
76
78
|
end
|
77
79
|
|
data/lib/bricolage/datasource.rb
CHANGED
@@ -5,15 +5,20 @@ require 'bricolage/exception'
|
|
5
5
|
module Bricolage
|
6
6
|
|
7
7
|
class DataSourceFactory
|
8
|
+
DATA_SOURCE_FILE_NAME_1 = 'datasource.yml'
|
9
|
+
DATA_SOURCE_FILE_NAME_2 = 'database.yml'
|
10
|
+
PASSWORD_FILE_NAME = 'password.yml'
|
11
|
+
|
8
12
|
def DataSourceFactory.load(context, logger)
|
9
13
|
loader = Loader.new(context, logger)
|
10
|
-
loader.load_passwords
|
11
|
-
|
14
|
+
loader.load_passwords(PASSWORD_FILE_NAME)
|
15
|
+
begin
|
16
|
+
return loader.load(DATA_SOURCE_FILE_NAME_1)
|
17
|
+
rescue ParameterError
|
18
|
+
return loader.load(DATA_SOURCE_FILE_NAME_2)
|
19
|
+
end
|
12
20
|
end
|
13
21
|
|
14
|
-
DEFAULT_CONFIG_FILE_NAME = 'database.yml'
|
15
|
-
DEFAULT_PASSWORD_FILE_NAME = 'password.yml'
|
16
|
-
|
17
22
|
class Loader < ConfigLoader
|
18
23
|
def initialize(context, logger)
|
19
24
|
super context.home_path
|
@@ -22,7 +27,7 @@ module Bricolage
|
|
22
27
|
@passwords = nil
|
23
28
|
end
|
24
29
|
|
25
|
-
def load_passwords(basename
|
30
|
+
def load_passwords(basename)
|
26
31
|
@context.config_pathes(basename).each do |path|
|
27
32
|
if path.exist?
|
28
33
|
@passwords = load_yaml(path)
|
@@ -31,11 +36,11 @@ module Bricolage
|
|
31
36
|
end
|
32
37
|
end
|
33
38
|
|
34
|
-
def load(basename
|
35
|
-
|
36
|
-
raise ParameterError, "database.yml does not exist" unless
|
37
|
-
@config_dir =
|
38
|
-
DataSourceFactory.new(load_yaml(
|
39
|
+
def load(basename)
|
40
|
+
yml_path = @context.config_pathes(basename).detect(&:exist?)
|
41
|
+
raise ParameterError, "database.yml does not exist" unless yml_path
|
42
|
+
@config_dir = yml_path.parent
|
43
|
+
DataSourceFactory.new(load_yaml(yml_path), @context, @logger)
|
39
44
|
end
|
40
45
|
|
41
46
|
def password(name)
|
data/lib/bricolage/job.rb
CHANGED
data/lib/bricolage/jobfile.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
1
|
require 'bricolage/exception'
|
2
2
|
require 'pathname'
|
3
|
+
require 'stringio'
|
3
4
|
|
4
5
|
module Bricolage
|
5
6
|
|
6
7
|
class JobFile
|
7
8
|
def JobFile.load(ctx, path)
|
8
|
-
values =
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
values =
|
10
|
+
case path.to_s
|
11
|
+
when /\.sql\.job\z/
|
12
|
+
load_embedded_definition(ctx, path)
|
13
|
+
when /\.(?:rb|py|sh)\.job\z/
|
14
|
+
load_program_embedded_definition(ctx, path)
|
15
|
+
else
|
16
|
+
ctx.parameter_file_loader.load_yaml(path)
|
17
|
+
end
|
13
18
|
parse(values, path)
|
14
19
|
end
|
15
20
|
|
16
21
|
class << JobFile
|
17
22
|
private
|
18
23
|
|
24
|
+
# For .sql.job
|
19
25
|
def load_embedded_definition(ctx, path)
|
20
|
-
sql = ctx.parameter_file_loader.
|
26
|
+
sql = ctx.parameter_file_loader.load_eruby(path)
|
21
27
|
block = sql.slice(%r{\A/\*.*?^\*/}m) or
|
22
28
|
raise ParameterError, "missing embedded job definition block: #{path}"
|
23
29
|
yaml = block.sub(%r{\A/\*}, '').sub(%r{^\*/\s*\z}, '')
|
@@ -70,6 +76,30 @@ module Bricolage
|
|
70
76
|
end
|
71
77
|
decls
|
72
78
|
end
|
79
|
+
|
80
|
+
# For .rb.job, .py.job, .sh.job ("#" comment style files)
|
81
|
+
# This method does NOT expand variables of parameter files.
|
82
|
+
def load_program_embedded_definition(ctx, path)
|
83
|
+
script = StringIO.new(ctx.parameter_file_loader.load_file(path))
|
84
|
+
first_line = script.gets
|
85
|
+
if first_line.start_with?('#!')
|
86
|
+
yaml_lines = []
|
87
|
+
else
|
88
|
+
yaml_lines = [first_line]
|
89
|
+
end
|
90
|
+
script.each_line do |line|
|
91
|
+
break unless line.start_with?('#')
|
92
|
+
yaml_lines.push line[1..-1]
|
93
|
+
end
|
94
|
+
yaml = yaml_lines.join
|
95
|
+
|
96
|
+
begin
|
97
|
+
values = YAML.load(yaml)
|
98
|
+
rescue => err
|
99
|
+
raise ParameterError, "#{path}: embedded job definition syntax error: #{err.message}"
|
100
|
+
end
|
101
|
+
values
|
102
|
+
end
|
73
103
|
end
|
74
104
|
|
75
105
|
def JobFile.parse(values, path)
|
@@ -97,6 +127,12 @@ module Bricolage
|
|
97
127
|
def subsystem
|
98
128
|
@path.parent.basename.to_s
|
99
129
|
end
|
130
|
+
|
131
|
+
def global_variables
|
132
|
+
{
|
133
|
+
'script' => @path.to_s
|
134
|
+
}
|
135
|
+
end
|
100
136
|
end
|
101
137
|
|
102
138
|
end
|
data/lib/bricolage/parameters.rb
CHANGED
@@ -604,8 +604,9 @@ module Bricolage
|
|
604
604
|
end
|
605
605
|
|
606
606
|
class StringListParam < Param
|
607
|
-
def initialize(name, arg_spec, description, optional: false, publish: false)
|
607
|
+
def initialize(name, arg_spec, description, optional: false, publish: false, allow_string: false)
|
608
608
|
super name, arg_spec, description, optional: optional, publish: publish
|
609
|
+
@allow_string = allow_string
|
609
610
|
end
|
610
611
|
|
611
612
|
def parse_option_value(value, list)
|
@@ -614,7 +615,10 @@ module Bricolage
|
|
614
615
|
end
|
615
616
|
|
616
617
|
def parse_value(vals)
|
617
|
-
|
618
|
+
unless vals.kind_of?(Array)
|
619
|
+
raise ParameterError, "bad type for parameter #{name}: #{vals.class}" unless @allow_string
|
620
|
+
vals = [vals]
|
621
|
+
end
|
618
622
|
vals.empty? ? nil : vals
|
619
623
|
end
|
620
624
|
|
data/lib/bricolage/version.rb
CHANGED