stratocumulus 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +8 -13
- data/Gemfile +1 -1
- data/README.md +3 -2
- data/Rakefile +5 -5
- data/bin/stratocumulus +1 -1
- data/lib/stratocumulus.rb +6 -6
- data/lib/stratocumulus/cli.rb +3 -3
- data/lib/stratocumulus/database.rb +18 -20
- data/lib/stratocumulus/database/mysql.rb +6 -6
- data/lib/stratocumulus/database/pipe_io.rb +1 -1
- data/lib/stratocumulus/database/postgresql.rb +7 -7
- data/lib/stratocumulus/retention.rb +4 -4
- data/lib/stratocumulus/runner.rb +4 -4
- data/lib/stratocumulus/storage.rb +20 -15
- data/lib/stratocumulus/version.rb +1 -1
- data/spec/intergration/database_spec.rb +17 -60
- data/spec/spec_helper.rb +9 -9
- data/spec/unit/cli_spec.rb +5 -5
- data/spec/unit/database_spec.rb +38 -41
- data/spec/unit/mysql_spec.rb +33 -33
- data/spec/unit/pipe_io_spec.rb +7 -7
- data/spec/unit/postgresql_spec.rb +33 -33
- data/spec/unit/retention_spec.rb +19 -20
- data/spec/unit/runner_spec.rb +22 -22
- data/spec/unit/storage_spec.rb +96 -77
- data/stratocumulus.gemspec +19 -19
- metadata +32 -58
- data/.coveralls.yml +0 -1
- data/lib/stratocumulus/database/rethinkdb.rb +0 -39
data/spec/spec_helper.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
2
|
+
require "simplecov"
|
3
|
+
require "codeclimate-test-reporter"
|
4
|
+
require "stringio"
|
5
5
|
|
6
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
7
7
|
SimpleCov::Formatter::HTMLFormatter,
|
8
|
-
|
9
|
-
]
|
8
|
+
CodeClimate::TestReporter::Formatter,
|
9
|
+
])
|
10
10
|
|
11
11
|
SimpleCov.start do
|
12
12
|
minimum_coverage 100
|
13
13
|
end
|
14
14
|
|
15
|
-
require
|
15
|
+
require "bundler/setup"
|
16
16
|
Bundler.setup
|
17
17
|
|
18
|
-
require
|
18
|
+
require "stratocumulus"
|
19
19
|
Fog.mock!
|
20
20
|
|
21
21
|
RSpec.configure do |config|
|
22
|
-
config.default_formatter =
|
22
|
+
config.default_formatter = "doc" if config.files_to_run.one?
|
23
23
|
|
24
24
|
config.profile_examples = 10
|
25
25
|
config.order = :random
|
data/spec/unit/cli_spec.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
4
|
describe Stratocumulus::Cli do
|
5
|
-
describe
|
5
|
+
describe "#backups" do
|
6
6
|
let(:runner) { double }
|
7
7
|
|
8
|
-
it
|
8
|
+
it "calls the runner with the path" do
|
9
9
|
expect(Stratocumulus::Runner).to receive(:new)
|
10
|
-
.with(
|
10
|
+
.with("/path/to/config.yml").and_return(runner)
|
11
11
|
|
12
12
|
expect(runner).to receive(:run)
|
13
13
|
|
14
|
-
subject.backup
|
14
|
+
subject.backup "/path/to/config.yml"
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/spec/unit/database_spec.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
4
|
describe Stratocumulus::Database do
|
5
|
-
|
6
5
|
subject do
|
7
6
|
described_class.build(config)
|
8
7
|
end
|
@@ -11,111 +10,109 @@ describe Stratocumulus::Database do
|
|
11
10
|
|
12
11
|
let(:base_config) do
|
13
12
|
{
|
14
|
-
|
15
|
-
|
13
|
+
"name" => "stratocumulus_test",
|
14
|
+
"type" => type,
|
16
15
|
}
|
17
16
|
end
|
18
17
|
|
19
|
-
let(:type) {
|
18
|
+
let(:type) { "mysql" }
|
20
19
|
|
21
20
|
before do
|
22
21
|
allow_any_instance_of(Stratocumulus::Database).to(
|
23
|
-
receive(:system).and_return(true)
|
22
|
+
receive(:system).and_return(true),
|
24
23
|
)
|
25
24
|
end
|
26
25
|
|
27
|
-
describe
|
28
|
-
context
|
29
|
-
let(:config) { base_config.merge(
|
26
|
+
describe ".new" do
|
27
|
+
context "the database type is not supported" do
|
28
|
+
let(:config) { base_config.merge("type" => "nosqlioid") }
|
30
29
|
|
31
|
-
it
|
30
|
+
it "thows an error unless the type is supported" do
|
32
31
|
expect { subject }.to raise_error(
|
33
32
|
RuntimeError,
|
34
|
-
|
33
|
+
"nosqlioid is not a supported database",
|
35
34
|
)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
|
-
context
|
40
|
-
it
|
38
|
+
context "mysql" do
|
39
|
+
it "throws an error if mysqldump is not installed" do
|
41
40
|
allow_any_instance_of(Stratocumulus::Database).to(
|
42
|
-
receive(:system).with(/which mysqldump/)
|
41
|
+
receive(:system).with(/which mysqldump/),
|
43
42
|
)
|
44
43
|
|
45
44
|
expect { subject }.to raise_error(
|
46
45
|
RuntimeError,
|
47
|
-
|
46
|
+
"mysqldump not available",
|
48
47
|
)
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
context
|
53
|
-
let(:type) {
|
51
|
+
context "postgresql" do
|
52
|
+
let(:type) { "psql" }
|
54
53
|
|
55
|
-
it
|
54
|
+
it "throws an error if pg_dump is not installed" do
|
56
55
|
allow_any_instance_of(Stratocumulus::Database)
|
57
|
-
|
56
|
+
.to receive(:system).with(/which pg_dump/)
|
58
57
|
|
59
58
|
expect { subject }.to raise_error(
|
60
59
|
RuntimeError,
|
61
|
-
|
60
|
+
"pg_dump not available",
|
62
61
|
)
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
it
|
65
|
+
it "throws an error if gzip is not installed" do
|
67
66
|
allow_any_instance_of(Stratocumulus::Database)
|
68
67
|
.to receive(:system).with(/which gzip/)
|
69
68
|
|
70
69
|
expect { subject }.to raise_error(
|
71
70
|
RuntimeError,
|
72
|
-
|
71
|
+
"gzip not available",
|
73
72
|
)
|
74
73
|
end
|
75
74
|
|
76
|
-
context
|
77
|
-
|
75
|
+
context "when no database name is provided" do
|
78
76
|
let(:config) do
|
79
|
-
{
|
77
|
+
{ "type" => "mysql" }
|
80
78
|
end
|
81
79
|
|
82
|
-
it
|
80
|
+
it "throws an error" do
|
83
81
|
expect { subject }.to raise_error(
|
84
82
|
RuntimeError,
|
85
|
-
|
83
|
+
"database name not specified",
|
86
84
|
)
|
87
85
|
end
|
88
|
-
|
89
86
|
end
|
90
87
|
end
|
91
88
|
|
92
|
-
describe
|
93
|
-
it
|
94
|
-
timestamp = Time.now.utc.strftime(
|
89
|
+
describe "#filename" do
|
90
|
+
it "calculates a filename based on the name and timestamp" do
|
91
|
+
timestamp = Time.now.utc.strftime("%Y%m%d%H%M")
|
95
92
|
filename = "stratocumulus_test/stratocumulus_test.#{timestamp}.sql.gz"
|
96
93
|
expect(subject.filename).to eq filename
|
97
94
|
end
|
98
95
|
|
99
|
-
it
|
96
|
+
it "stays the same for an instance even if time moves on" do
|
100
97
|
filename = subject.filename
|
101
98
|
allow(Time).to receive(:now).and_return(Time.now + 60 * 60 * 26)
|
102
99
|
expect(subject.filename).to eq filename
|
103
100
|
end
|
104
101
|
end
|
105
102
|
|
106
|
-
describe
|
107
|
-
describe
|
108
|
-
subject { FailingDatabase.new(
|
103
|
+
describe "#success?" do
|
104
|
+
describe "the dump fails" do
|
105
|
+
subject { FailingDatabase.new("name" => "test_database") }
|
109
106
|
|
110
|
-
it
|
107
|
+
it "returns false" do
|
111
108
|
expect(subject).to_not be_success
|
112
109
|
end
|
113
110
|
end
|
114
111
|
|
115
|
-
describe
|
116
|
-
subject { SucessDatabase.new(
|
112
|
+
describe "the dump is sucessfull" do
|
113
|
+
subject { SucessDatabase.new("name" => "test_database") }
|
117
114
|
|
118
|
-
it
|
115
|
+
it "returns false" do
|
119
116
|
expect(subject).to be_success
|
120
117
|
end
|
121
118
|
end
|
@@ -123,13 +120,13 @@ describe Stratocumulus::Database do
|
|
123
120
|
|
124
121
|
class SucessDatabase < described_class
|
125
122
|
def command
|
126
|
-
|
123
|
+
"echo boo"
|
127
124
|
end
|
128
125
|
end
|
129
126
|
|
130
127
|
class FailingDatabase < described_class
|
131
128
|
def command
|
132
|
-
|
129
|
+
"exit 127"
|
133
130
|
end
|
134
131
|
end
|
135
132
|
end
|
data/spec/unit/mysql_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
4
|
describe Stratocumulus::MySQL do
|
5
5
|
subject do
|
@@ -7,96 +7,96 @@ describe Stratocumulus::MySQL do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:config) do
|
10
|
-
{
|
10
|
+
{ "name" => "stratocumulus_test" }
|
11
11
|
end
|
12
12
|
|
13
|
-
describe
|
13
|
+
describe "#dependencies" do
|
14
14
|
specify do
|
15
15
|
expect(subject.dependencies).to eq %w(gzip mysqldump)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe
|
20
|
-
context
|
21
|
-
it
|
19
|
+
describe "#command" do
|
20
|
+
context "default" do
|
21
|
+
it "generates the dump command with sensible defaults" do
|
22
22
|
expect(subject.command).to eq(
|
23
|
-
|
23
|
+
"mysqldump --single-transaction -uroot stratocumulus_test",
|
24
24
|
)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
28
|
+
context "with the password set" do
|
29
29
|
let(:config) do
|
30
30
|
{
|
31
|
-
|
32
|
-
|
31
|
+
"name" => "stratocumulus_test",
|
32
|
+
"password" => "seecrit",
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it "generates the dump command with a default host" do
|
37
37
|
expect(subject.command).to eq(
|
38
|
-
|
38
|
+
"mysqldump --single-transaction -uroot -pseecrit stratocumulus_test",
|
39
39
|
)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
context
|
43
|
+
context "with the port set" do
|
44
44
|
let(:config) do
|
45
45
|
{
|
46
|
-
|
47
|
-
|
46
|
+
"name" => "stratocumulus_test",
|
47
|
+
"port" => 13_306,
|
48
48
|
}
|
49
49
|
end
|
50
50
|
|
51
|
-
it
|
51
|
+
it "generates the dump command with a default host" do
|
52
52
|
expect(subject.command).to eq(
|
53
|
-
|
53
|
+
"mysqldump --single-transaction -uroot -hlocalhost -P13306 stratocumulus_test" # rubocop:disable Metrics/LineLength
|
54
54
|
)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
context
|
58
|
+
context "with the host set" do
|
59
59
|
let(:config) do
|
60
60
|
{
|
61
|
-
|
62
|
-
|
61
|
+
"name" => "stratocumulus_test",
|
62
|
+
"host" => "db.example.com",
|
63
63
|
}
|
64
64
|
end
|
65
65
|
|
66
|
-
it
|
66
|
+
it "generates the dump command with a default port" do
|
67
67
|
expect(subject.command).to eq(
|
68
|
-
|
68
|
+
"mysqldump --single-transaction -uroot -hdb.example.com -P3306 stratocumulus_test" # rubocop:disable Metrics/LineLength
|
69
69
|
)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
context
|
73
|
+
context "with the port and host set" do
|
74
74
|
let(:config) do
|
75
75
|
{
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
"name" => "stratocumulus_test",
|
77
|
+
"port" => 33_306,
|
78
|
+
"host" => "db.example.com",
|
79
79
|
}
|
80
80
|
end
|
81
81
|
|
82
|
-
it
|
82
|
+
it "generates the dump command with the port and host" do
|
83
83
|
expect(subject.command).to eq(
|
84
|
-
|
84
|
+
"mysqldump --single-transaction -uroot -hdb.example.com -P33306 stratocumulus_test" # rubocop:disable Metrics/LineLength
|
85
85
|
)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
context
|
89
|
+
context "with the username set" do
|
90
90
|
let(:config) do
|
91
91
|
{
|
92
|
-
|
93
|
-
|
92
|
+
"name" => "stratocumulus_test",
|
93
|
+
"username" => "susan",
|
94
94
|
}
|
95
95
|
end
|
96
96
|
|
97
|
-
it
|
97
|
+
it "generates the dump command with the username" do
|
98
98
|
expect(subject.command).to eq(
|
99
|
-
|
99
|
+
"mysqldump --single-transaction -ususan stratocumulus_test",
|
100
100
|
)
|
101
101
|
end
|
102
102
|
end
|
data/spec/unit/pipe_io_spec.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
4
|
describe Stratocumulus::Database::PipeIO do
|
5
5
|
subject do
|
6
|
-
described_class.popen(
|
6
|
+
described_class.popen("echo foo")
|
7
7
|
end
|
8
8
|
|
9
9
|
after do
|
10
10
|
subject.close
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
13
|
+
it "behaves like IO" do
|
14
14
|
expect(subject.read).to eq "foo\n"
|
15
15
|
end
|
16
16
|
|
17
|
-
describe
|
18
|
-
it
|
17
|
+
describe "#rewind" do
|
18
|
+
it "is not defined" do
|
19
19
|
expect(subject).to_not respond_to(:rewind)
|
20
20
|
end
|
21
21
|
end
|
@@ -24,11 +24,11 @@ end
|
|
24
24
|
describe IO do
|
25
25
|
subject do
|
26
26
|
described_class.open(
|
27
|
-
described_class.sysopen(
|
27
|
+
described_class.sysopen("spec/support/test_config_file.yml"),
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
31
|
-
it
|
31
|
+
it "is not affected" do
|
32
32
|
subject.read
|
33
33
|
subject.rewind
|
34
34
|
expect(subject.read).to_not be_nil
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
4
|
describe Stratocumulus::PostgreSQL do
|
5
5
|
subject do
|
@@ -7,96 +7,96 @@ describe Stratocumulus::PostgreSQL do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:config) do
|
10
|
-
{
|
10
|
+
{ "name" => "stratocumulus_test" }
|
11
11
|
end
|
12
12
|
|
13
|
-
describe
|
13
|
+
describe "#dependencies" do
|
14
14
|
specify do
|
15
15
|
expect(subject.dependencies).to eq %w(gzip pg_dump)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe
|
20
|
-
context
|
21
|
-
it
|
19
|
+
describe "#command" do
|
20
|
+
context "default" do
|
21
|
+
it "generates the dump command with sensible defaults" do
|
22
22
|
expect(subject.command).to eq(
|
23
|
-
|
23
|
+
"pg_dump -Upostgres stratocumulus_test",
|
24
24
|
)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
28
|
+
context "with the password set" do
|
29
29
|
let(:config) do
|
30
30
|
{
|
31
|
-
|
32
|
-
|
31
|
+
"name" => "stratocumulus_test",
|
32
|
+
"password" => "sekret",
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it "sets the password env var" do
|
37
37
|
expect(subject.command).to eq(
|
38
|
-
'PGPASSWORD="sekret" pg_dump -Upostgres stratocumulus_test'
|
38
|
+
'PGPASSWORD="sekret" pg_dump -Upostgres stratocumulus_test',
|
39
39
|
)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
context
|
43
|
+
context "with the port set" do
|
44
44
|
let(:config) do
|
45
45
|
{
|
46
|
-
|
47
|
-
|
46
|
+
"name" => "stratocumulus_test",
|
47
|
+
"port" => 15_432,
|
48
48
|
}
|
49
49
|
end
|
50
50
|
|
51
|
-
it
|
51
|
+
it "generates the dump command with a default host" do
|
52
52
|
expect(subject.command).to eq(
|
53
|
-
|
53
|
+
"pg_dump -Upostgres -hlocalhost -p15432 stratocumulus_test",
|
54
54
|
)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
context
|
58
|
+
context "with the host set" do
|
59
59
|
let(:config) do
|
60
60
|
{
|
61
|
-
|
62
|
-
|
61
|
+
"name" => "stratocumulus_test",
|
62
|
+
"host" => "db.example.com",
|
63
63
|
}
|
64
64
|
end
|
65
65
|
|
66
|
-
it
|
66
|
+
it "generates the dump command with a default port" do
|
67
67
|
expect(subject.command).to eq(
|
68
|
-
|
68
|
+
"pg_dump -Upostgres -hdb.example.com -p5432 stratocumulus_test",
|
69
69
|
)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
context
|
73
|
+
context "with the port and host set" do
|
74
74
|
let(:config) do
|
75
75
|
{
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
"name" => "stratocumulus_test",
|
77
|
+
"port" => 15_432,
|
78
|
+
"host" => "db.example.com",
|
79
79
|
}
|
80
80
|
end
|
81
81
|
|
82
|
-
it
|
82
|
+
it "generates the dump command with port and host set" do
|
83
83
|
expect(subject.command).to eq(
|
84
|
-
|
84
|
+
"pg_dump -Upostgres -hdb.example.com -p15432 stratocumulus_test",
|
85
85
|
)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
context
|
89
|
+
context "with the username set" do
|
90
90
|
let(:config) do
|
91
91
|
{
|
92
|
-
|
93
|
-
|
92
|
+
"name" => "stratocumulus_test",
|
93
|
+
"username" => "susan",
|
94
94
|
}
|
95
95
|
end
|
96
96
|
|
97
|
-
it
|
97
|
+
it "generates the dump command with the username" do
|
98
98
|
expect(subject.command).to eq(
|
99
|
-
|
99
|
+
"pg_dump -Ususan stratocumulus_test",
|
100
100
|
)
|
101
101
|
end
|
102
102
|
end
|