jisota 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +21 -0
- data/README.md +106 -2
- data/Rakefile +10 -0
- data/jisota.gemspec +1 -0
- data/lib/jisota.rb +4 -2
- data/lib/jisota/collection.rb +2 -4
- data/lib/jisota/command_script.rb +3 -2
- data/lib/jisota/composite_script.rb +2 -2
- data/lib/jisota/configuration.rb +3 -3
- data/lib/jisota/dsl_base.rb +12 -0
- data/lib/jisota/file_script.rb +107 -9
- data/lib/jisota/nil_output.rb +14 -0
- data/lib/jisota/{logger.rb → output.rb} +16 -35
- data/lib/jisota/package.rb +2 -2
- data/lib/jisota/package_script.rb +28 -20
- data/lib/jisota/packages/gem_install.rb +17 -0
- data/lib/jisota/packages/nginx_passenger.rb +34 -0
- data/lib/jisota/packages/ruby.rb +2 -2
- data/lib/jisota/param_parser.rb +30 -19
- data/lib/jisota/provisioner.rb +7 -3
- data/lib/jisota/script_block.rb +13 -14
- data/lib/jisota/script_context.rb +24 -0
- data/lib/jisota/server.rb +2 -1
- data/lib/jisota/ssh_engine.rb +6 -2
- data/lib/jisota/ssh_session.rb +10 -15
- data/lib/jisota/version.rb +1 -1
- data/package_files/nginx_passenger/nginx_service +65 -0
- data/spec/acceptance/ruby_passenger_nginx_spec.rb +24 -0
- data/spec/acceptance/simple_script_spec.rb +8 -24
- data/spec/acceptance/upload_blocks_spec.rb +34 -0
- data/spec/lib/jisota/collection_spec.rb +10 -0
- data/spec/lib/jisota/command_script_spec.rb +4 -3
- data/spec/lib/jisota/composite_script_spec.rb +8 -6
- data/spec/lib/jisota/configuration_spec.rb +1 -3
- data/spec/lib/jisota/dsl_base_spec.rb +37 -0
- data/spec/lib/jisota/file_script_spec.rb +63 -8
- data/spec/lib/jisota/output_spec.rb +84 -0
- data/spec/lib/jisota/package_script_spec.rb +20 -8
- data/spec/lib/jisota/package_spec.rb +2 -6
- data/spec/lib/jisota/packages/apt_spec.rb +7 -4
- data/spec/lib/jisota/packages/gem_install_spec.rb +18 -0
- data/spec/lib/jisota/packages/nginx_passenger_spec.rb +17 -0
- data/spec/lib/jisota/packages/ruby_spec.rb +6 -3
- data/spec/lib/jisota/param_parser_spec.rb +105 -0
- data/spec/lib/jisota/provisioner_spec.rb +30 -0
- data/spec/lib/jisota/role_spec.rb +1 -3
- data/spec/lib/jisota/script_block_spec.rb +7 -4
- data/spec/lib/jisota/ssh_engine_spec.rb +26 -0
- data/spec/lib/jisota/ssh_session_spec.rb +53 -0
- data/spec/spec_helper.rb +11 -1
- data/spec/support/acceptance_helpers.rb +45 -0
- data/spec/test_files/nginx_default.conf +121 -0
- data/spec/vagrant/Vagrantfile +118 -0
- data/spec/vagrant/ssh_key +27 -0
- metadata +55 -7
- data/lib/jisota/upload_file.rb +0 -3
- data/spec/lib/jisota/logger_spec.rb +0 -34
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Jisota
|
4
|
+
describe Output do
|
5
|
+
let(:logger) { Output.new(stdout: stdout, stderr: stderr, verbose: verbose) }
|
6
|
+
let(:stdout) { instance_double(IO, write: nil, flush: nil) }
|
7
|
+
let(:stderr) { instance_double(IO, write: nil, flush: nil) }
|
8
|
+
let(:verbose) { true }
|
9
|
+
|
10
|
+
describe "initialization" do
|
11
|
+
it "initializes with options" do
|
12
|
+
logger = Output.new(stdout: :out, stderr: :err, verbose: false)
|
13
|
+
expect(logger.stdout).to eq(:out)
|
14
|
+
expect(logger.stderr).to eq(:err)
|
15
|
+
expect(logger.verbose).to be false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#info' do
|
20
|
+
it "writes to stdout" do
|
21
|
+
logger.info("foo")
|
22
|
+
expect(stdout).to have_received(:write).with("foo")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#error" do
|
27
|
+
it "writes to stderr" do
|
28
|
+
logger.error("foo")
|
29
|
+
expect(stderr).to have_received(:write).with("foo")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#warn" do
|
34
|
+
context "verbose" do
|
35
|
+
let(:verbose) { true }
|
36
|
+
it "outputs" do
|
37
|
+
logger.warn("foo")
|
38
|
+
expect(stderr).to have_received(:write).with("foo")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "not verbose" do
|
43
|
+
let(:verbose) { false }
|
44
|
+
it "outputs" do
|
45
|
+
logger.warn("foo")
|
46
|
+
expect(stderr).to_not have_received(:write).with("foo")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#system_message" do
|
52
|
+
it "outputs message" do
|
53
|
+
logger.system_message("foo")
|
54
|
+
expect(stdout).to have_received(:write).with("-----> foo\n")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#indent" do
|
59
|
+
it "indents subsequent output" do
|
60
|
+
logger.indent
|
61
|
+
logger.system_message("foo")
|
62
|
+
expect(stdout).to have_received(:write).with("-----> foo\n")
|
63
|
+
|
64
|
+
logger.outdent
|
65
|
+
logger.system_message("foo")
|
66
|
+
expect(stdout).to have_received(:write).with("-----> foo\n")
|
67
|
+
end
|
68
|
+
|
69
|
+
context "with a block" do
|
70
|
+
it "indents logs inside block" do
|
71
|
+
result = logger.indent do
|
72
|
+
logger.system_message("foo")
|
73
|
+
42
|
74
|
+
end
|
75
|
+
logger.system_message("bar")
|
76
|
+
expect(stdout).to have_received(:write).with("-----> foo\n")
|
77
|
+
expect(stdout).to have_received(:write).with("-----> bar\n")
|
78
|
+
expect(result).to eq(42)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
@@ -3,17 +3,18 @@ require 'spec_helper'
|
|
3
3
|
module Jisota
|
4
4
|
describe PackageScript do
|
5
5
|
describe "#execute" do
|
6
|
-
let(:ssh_session) { instance_double(SSHSession, command:
|
6
|
+
let(:ssh_session) { instance_double(SSHSession, command: 0) }
|
7
|
+
let(:context) { ScriptContext.new(ssh_session: ssh_session) }
|
7
8
|
|
8
9
|
it "executes each script from the block" do
|
9
10
|
package = Package.new do
|
10
11
|
run { cmd "foo" }
|
11
12
|
end
|
12
13
|
package_script = PackageScript.new(package)
|
13
|
-
result = package_script.execute(
|
14
|
+
result = package_script.execute(context)
|
14
15
|
|
15
16
|
expect(result).to be true
|
16
|
-
expect(ssh_session).to have_received(:command).with("foo",
|
17
|
+
expect(ssh_session).to have_received(:command).with("foo", anything)
|
17
18
|
end
|
18
19
|
|
19
20
|
it "parses args" do
|
@@ -22,9 +23,9 @@ module Jisota
|
|
22
23
|
run { cmd "foo #{bar}" }
|
23
24
|
end
|
24
25
|
package_script = PackageScript.new(package, ["baz"])
|
25
|
-
package_script.execute(
|
26
|
+
package_script.execute(context)
|
26
27
|
|
27
|
-
expect(ssh_session).to have_received(:command).with("foo baz",
|
28
|
+
expect(ssh_session).to have_received(:command).with("foo baz", anything)
|
28
29
|
end
|
29
30
|
|
30
31
|
it "uses verify block" do
|
@@ -33,10 +34,21 @@ module Jisota
|
|
33
34
|
verify { cmd "bar" }
|
34
35
|
end
|
35
36
|
package_script = PackageScript.new(package)
|
36
|
-
package_script.execute(
|
37
|
+
package_script.execute(context)
|
37
38
|
|
38
|
-
expect(ssh_session).to have_received(:command).with("bar",
|
39
|
-
expect(ssh_session).to_not have_received(:command).with("foo",
|
39
|
+
expect(ssh_session).to have_received(:command).with("bar", anything)
|
40
|
+
expect(ssh_session).to_not have_received(:command).with("foo", anything)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#to_s" do
|
45
|
+
it "outputs a nice representation of the script" do
|
46
|
+
package = Package.new(:nginx)
|
47
|
+
|
48
|
+
expect(PackageScript.new(package, []).to_s).to eq("nginx")
|
49
|
+
expect(PackageScript.new(package, ["foo"]).to_s).to eq('nginx "foo"')
|
50
|
+
expect(PackageScript.new(package, ["foo", 42]).to_s).to eq('nginx "foo", 42')
|
51
|
+
expect(PackageScript.new(package, [{ foo: 42 }]).to_s).to eq("nginx {:foo=>42}")
|
40
52
|
end
|
41
53
|
end
|
42
54
|
end
|
@@ -53,12 +53,8 @@ module Jisota
|
|
53
53
|
description "Does cool stuff"
|
54
54
|
param :foo
|
55
55
|
param :bar, default: 42
|
56
|
-
run
|
57
|
-
|
58
|
-
end
|
59
|
-
verify do
|
60
|
-
cmd "[ -f foo ]"
|
61
|
-
end
|
56
|
+
run { cmd "touch #{foo}" }
|
57
|
+
verify { cmd "[ -f foo ]" }
|
62
58
|
end
|
63
59
|
|
64
60
|
expect(package.name).to eq(:my_awesome_package)
|
@@ -2,14 +2,17 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
module Jisota
|
5
|
-
describe "
|
5
|
+
describe "Apt package" do
|
6
6
|
it "is valid" do
|
7
7
|
script_block = ScriptBlock.new do
|
8
8
|
apt :curl
|
9
9
|
end
|
10
|
-
|
11
|
-
ssh_session
|
12
|
-
|
10
|
+
ssh_session = instance_double(SSHSession, upload: true)
|
11
|
+
allow(ssh_session).to receive(:command).and_return(false, true)
|
12
|
+
context = ScriptContext.new(ssh_session: ssh_session, packages: Jisota.global_packages)
|
13
|
+
script = script_block.evaluate(context)
|
14
|
+
|
15
|
+
expect { script.execute(context) }.to_not raise_exception
|
13
16
|
end
|
14
17
|
end
|
15
18
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Jisota
|
4
|
+
describe "Gem-install package" do
|
5
|
+
it "is valid" do
|
6
|
+
script_block = ScriptBlock.new do
|
7
|
+
gem_install :foo
|
8
|
+
end
|
9
|
+
ssh_session = instance_double(SSHSession)
|
10
|
+
allow(ssh_session).to receive(:command).and_return(1, 0)
|
11
|
+
context = ScriptContext.new(ssh_session: ssh_session, packages: Jisota.global_packages)
|
12
|
+
script = script_block.evaluate(context)
|
13
|
+
|
14
|
+
expect { script.execute(context) }.to_not raise_exception
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Jisota
|
4
|
+
describe "Nginx Passenger package" do
|
5
|
+
it "is valid" do
|
6
|
+
script_block = ScriptBlock.new do
|
7
|
+
nginx_passenger config_file: "foo"
|
8
|
+
end
|
9
|
+
ssh_session = instance_double(SSHSession, upload: true, command: 0)
|
10
|
+
context = ScriptContext.new(ssh_session: ssh_session, packages: Jisota.global_packages)
|
11
|
+
script = script_block.evaluate(context)
|
12
|
+
|
13
|
+
expect { script.execute(context) }.to_not raise_exception
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -6,9 +6,12 @@ module Jisota
|
|
6
6
|
script_block = ScriptBlock.new do
|
7
7
|
ruby version: "2.1.1"
|
8
8
|
end
|
9
|
-
|
10
|
-
ssh_session
|
11
|
-
|
9
|
+
ssh_session = instance_double(SSHSession, upload: true)
|
10
|
+
allow(ssh_session).to receive(:command).and_return(false, true)
|
11
|
+
context = ScriptContext.new(ssh_session: ssh_session, packages: Jisota.global_packages)
|
12
|
+
script = script_block.evaluate(context)
|
13
|
+
|
14
|
+
expect { script.execute(context) }.to_not raise_exception
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jisota::ParamParser do
|
4
|
+
subject { parser.parse() }
|
5
|
+
let(:parser) { Jisota::ParamParser.new(params, args) }
|
6
|
+
let(:params) { [] }
|
7
|
+
let(:args) { [] }
|
8
|
+
|
9
|
+
def should_raise(error)
|
10
|
+
expect { subject }.to raise_exception(error)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "no params" do
|
14
|
+
context "no args" do
|
15
|
+
it { should eq Hash.new }
|
16
|
+
end
|
17
|
+
|
18
|
+
context "implicit arg" do
|
19
|
+
let(:args) { [42] }
|
20
|
+
it { should_raise(Jisota::ParameterError) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "hash arg" do
|
24
|
+
let(:args) { [ { foo: 42 } ] }
|
25
|
+
it { should_raise(Jisota::ParameterError) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "param with no options" do
|
30
|
+
let(:params) { [Jisota::Param.new(:foo)] }
|
31
|
+
|
32
|
+
context "no args" do
|
33
|
+
it { should eq({foo: nil}) }
|
34
|
+
end
|
35
|
+
|
36
|
+
context "implicit arg" do
|
37
|
+
let(:args) { [42] }
|
38
|
+
it { should eq({foo: 42}) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "repeated implicit arg" do
|
42
|
+
let(:args) { [42, { foo: 42 }] }
|
43
|
+
it { should_raise(Jisota::ParameterError) }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "hash arg" do
|
47
|
+
let(:args) { [ { foo: 42 } ] }
|
48
|
+
it { should eq({foo: 42}) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "param with required: true" do
|
53
|
+
let(:params) { [Jisota::Param.new(:foo, required: true)] }
|
54
|
+
|
55
|
+
context "no args" do
|
56
|
+
it { should_raise(Jisota::ParameterError) }
|
57
|
+
end
|
58
|
+
|
59
|
+
context "implicit arg" do
|
60
|
+
let(:args) { [42] }
|
61
|
+
it { should eq({foo: 42}) }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "hash arg" do
|
65
|
+
let(:args) { [ { foo: 42 } ] }
|
66
|
+
it { should eq({foo: 42}) }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "param with default" do
|
71
|
+
let(:params) { [Jisota::Param.new(:foo, default: 48)] }
|
72
|
+
|
73
|
+
context "no args" do
|
74
|
+
it { should eq({foo: 48}) }
|
75
|
+
end
|
76
|
+
|
77
|
+
context "implicit arg" do
|
78
|
+
let(:args) { [42] }
|
79
|
+
it { should eq({foo: 42}) }
|
80
|
+
end
|
81
|
+
|
82
|
+
context "hash arg" do
|
83
|
+
let(:args) { [ { foo: 42 } ] }
|
84
|
+
it { should eq({foo: 42}) }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "param with splat: true" do
|
89
|
+
let(:params) { [Jisota::Param.new(:foo, splat: true)] }
|
90
|
+
|
91
|
+
context "no args" do
|
92
|
+
it { should eq({foo: []}) }
|
93
|
+
end
|
94
|
+
|
95
|
+
context "implicit arg" do
|
96
|
+
let(:args) { [42] }
|
97
|
+
it { should eq({foo: [42]}) }
|
98
|
+
end
|
99
|
+
|
100
|
+
context "hash arg" do
|
101
|
+
let(:args) { [ { foo: 42 } ] }
|
102
|
+
it { should_raise(Jisota::ParameterError) }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Jisota
|
4
|
+
describe Provisioner do
|
5
|
+
describe "#run" do
|
6
|
+
|
7
|
+
let(:ssh_engine) do
|
8
|
+
instance_double(SSHEngine).tap do |ssh|
|
9
|
+
allow(ssh).to receive(:start).with({user: "john", host: "123.456.789.0"}).and_yield(ssh_session)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
let(:ssh_session) { instance_double(SSHSession, command: 0) }
|
13
|
+
|
14
|
+
it "executes a script" do
|
15
|
+
config = Configuration.new do
|
16
|
+
role :app do
|
17
|
+
cmd "touch foo"
|
18
|
+
end
|
19
|
+
server "123.456.789.0", user: "john", roles: :app
|
20
|
+
end
|
21
|
+
config.ssh_engine = ssh_engine
|
22
|
+
|
23
|
+
provisioner = Provisioner.new
|
24
|
+
provisioner.run(config, NilOutput.new)
|
25
|
+
|
26
|
+
expect(ssh_session).to have_received(:command).with("touch foo", anything)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -20,9 +20,7 @@ module Jisota
|
|
20
20
|
|
21
21
|
describe "DSL" do
|
22
22
|
it "initializes with DSL" do
|
23
|
-
role = Role.new(:app)
|
24
|
-
cmd "touch foo"
|
25
|
-
end
|
23
|
+
role = Role.new(:app) { cmd "touch foo" }
|
26
24
|
expect(role.name).to eq(:app)
|
27
25
|
expect(role.script_block).to be_a(ScriptBlock)
|
28
26
|
end
|
@@ -23,13 +23,15 @@ module Jisota
|
|
23
23
|
expect(script.scripts[0]).to be_a(CommandScript)
|
24
24
|
expect(script.scripts[0].command).to eq("foo")
|
25
25
|
expect(script.scripts[1]).to be_a(FileScript)
|
26
|
-
expect(script.scripts[1].
|
26
|
+
expect(script.scripts[1].from).to eq("x")
|
27
|
+
expect(script.scripts[1].to).to eq("y")
|
27
28
|
end
|
28
29
|
|
29
30
|
it "parses args" do
|
30
31
|
script_block = ScriptBlock.new { cmd "touch #{foo}" }
|
31
|
-
|
32
|
-
|
32
|
+
params = { foo: "bar" }
|
33
|
+
context = ScriptContext.new(params: params)
|
34
|
+
script = script_block.evaluate(context)
|
33
35
|
|
34
36
|
expect(script.scripts.first.command).to eq("touch bar")
|
35
37
|
end
|
@@ -38,8 +40,9 @@ module Jisota
|
|
38
40
|
script_block = ScriptBlock.new { touch "file" }
|
39
41
|
packages = Collection.new
|
40
42
|
packages << Package.new(:touch)
|
43
|
+
context = ScriptContext.new(packages: packages)
|
41
44
|
|
42
|
-
script = script_block.evaluate(
|
45
|
+
script = script_block.evaluate(context)
|
43
46
|
script = script.scripts.first
|
44
47
|
|
45
48
|
expect(script).to be_a(PackageScript)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Jisota
|
4
|
+
describe SSHEngine do
|
5
|
+
describe "#start" do
|
6
|
+
let(:engine) do
|
7
|
+
class_double(Net::SSH).tap do |engine|
|
8
|
+
allow(engine).to receive(:start).and_yield(nil)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
let(:wrapper) { SSHEngine.new(engine: engine) }
|
12
|
+
|
13
|
+
it "starts the engine" do
|
14
|
+
wrapper.start(user: "john", host: "foo") { |ssh_session| }
|
15
|
+
|
16
|
+
expect(engine).to have_received(:start).with("foo", "john", {})
|
17
|
+
end
|
18
|
+
|
19
|
+
it "passes extra options to engine" do
|
20
|
+
wrapper.start(user: "john", host: "foo", foo: "bar", bar: "baz") { |ssh_session| }
|
21
|
+
|
22
|
+
expect(engine).to have_received(:start).with("foo", "john", { foo: "bar", bar: "baz" })
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|