producer-core 0.5.8 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/producer/core/version.rb +1 -1
- metadata +21 -202
- data/.gitignore +0 -3
- data/.travis.yml +0 -14
- data/Gemfile +0 -5
- data/Guardfile +0 -14
- data/LICENSE +0 -30
- data/Rakefile +0 -19
- data/config/cucumber.yaml +0 -2
- data/features/actions/echo.feature +0 -11
- data/features/actions/file_append.feature +0 -15
- data/features/actions/file_replace_content.feature +0 -24
- data/features/actions/file_write.feature +0 -21
- data/features/actions/mkdir.feature +0 -31
- data/features/actions/sh.feature +0 -43
- data/features/actions/yaml_write.feature +0 -14
- data/features/cli/debug.feature +0 -19
- data/features/cli/dry_run.feature +0 -22
- data/features/cli/error_reporting.feature +0 -32
- data/features/cli/target.feature +0 -15
- data/features/cli/usage.feature +0 -13
- data/features/cli/verbose.feature +0 -48
- data/features/condition/negated_test.feature +0 -47
- data/features/condition/target.feature +0 -15
- data/features/recipe/compose_macro.feature +0 -29
- data/features/recipe/errors.feature +0 -9
- data/features/recipe/macro.feature +0 -50
- data/features/recipe/registry.feature +0 -82
- data/features/recipe/source.feature +0 -17
- data/features/recipe/target.feature +0 -23
- data/features/recipe/test_macro.feature +0 -50
- data/features/ssh/config.feature +0 -25
- data/features/steps/environment_steps.rb +0 -3
- data/features/support/env.rb +0 -1
- data/features/task/ask.feature +0 -23
- data/features/task/condition.feature +0 -13
- data/features/task/nested_tasks.feature +0 -20
- data/features/task/recipe_argv.feature +0 -13
- data/features/task/target.feature +0 -11
- data/features/task/template.feature +0 -49
- data/features/tests/dir.feature +0 -21
- data/features/tests/env.feature +0 -47
- data/features/tests/executable.feature +0 -26
- data/features/tests/file.feature +0 -21
- data/features/tests/file_contains.feature +0 -26
- data/features/tests/file_eq.feature +0 -26
- data/features/tests/file_match.feature +0 -26
- data/features/tests/shell_command_status.feature +0 -46
- data/features/tests/yaml_eq.feature +0 -26
- data/producer-core.gemspec +0 -28
- data/spec/fixtures/recipes/empty.rb +0 -1
- data/spec/fixtures/recipes/raise.rb +0 -1
- data/spec/fixtures/recipes/some_recipe.rb +0 -5
- data/spec/fixtures/recipes/throw.rb +0 -1
- data/spec/fixtures/templates/basic.erb +0 -1
- data/spec/fixtures/templates/basic_yaml.yaml +0 -1
- data/spec/fixtures/templates/variables.erb +0 -1
- data/spec/producer/core/action_spec.rb +0 -46
- data/spec/producer/core/actions/echo_spec.rb +0 -20
- data/spec/producer/core/actions/file_append_spec.rb +0 -49
- data/spec/producer/core/actions/file_replace_content_spec.rb +0 -42
- data/spec/producer/core/actions/file_writer_spec.rb +0 -52
- data/spec/producer/core/actions/mkdir_spec.rb +0 -71
- data/spec/producer/core/actions/shell_command_spec.rb +0 -45
- data/spec/producer/core/actions/yaml_writer_spec.rb +0 -25
- data/spec/producer/core/cli_spec.rb +0 -211
- data/spec/producer/core/condition_spec.rb +0 -198
- data/spec/producer/core/env_spec.rb +0 -196
- data/spec/producer/core/error_formatter_spec.rb +0 -86
- data/spec/producer/core/logger_formatter_spec.rb +0 -26
- data/spec/producer/core/prompter_spec.rb +0 -40
- data/spec/producer/core/recipe/file_evaluator_spec.rb +0 -22
- data/spec/producer/core/recipe_spec.rb +0 -126
- data/spec/producer/core/remote/environment_spec.rb +0 -19
- data/spec/producer/core/remote/fs_spec.rb +0 -144
- data/spec/producer/core/remote_spec.rb +0 -168
- data/spec/producer/core/task_spec.rb +0 -198
- data/spec/producer/core/template_spec.rb +0 -41
- data/spec/producer/core/test_spec.rb +0 -7
- data/spec/producer/core/testing/mock_remote_spec.rb +0 -66
- data/spec/producer/core/tests/condition_test_spec.rb +0 -55
- data/spec/producer/core/tests/file_contains_spec.rb +0 -46
- data/spec/producer/core/tests/file_eq_spec.rb +0 -45
- data/spec/producer/core/tests/file_match_spec.rb +0 -46
- data/spec/producer/core/tests/has_dir_spec.rb +0 -25
- data/spec/producer/core/tests/has_env_spec.rb +0 -75
- data/spec/producer/core/tests/has_executable_spec.rb +0 -29
- data/spec/producer/core/tests/has_file_spec.rb +0 -25
- data/spec/producer/core/tests/shell_command_status_spec.rb +0 -34
- data/spec/producer/core/tests/yaml_eq_spec.rb +0 -47
- data/spec/producer/core/worker_spec.rb +0 -88
- data/spec/spec_helper.rb +0 -13
- data/spec/support/exit_helpers.rb +0 -6
- data/spec/support/fixtures_helpers.rb +0 -7
- data/spec/support/net_ssh_story_helpers.rb +0 -36
- data/spec/support/shared_action.rb +0 -44
- data/spec/support/shared_test.rb +0 -82
- data/spec/support/test_env_helpers.rb +0 -44
data/features/tests/file.feature
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `file?' condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :file_test do
|
8
|
-
condition { file? 'some_file' }
|
9
|
-
|
10
|
-
echo 'evaluated'
|
11
|
-
end
|
12
|
-
"""
|
13
|
-
|
14
|
-
Scenario: succeeds when file exists
|
15
|
-
Given a remote file named "some_file"
|
16
|
-
When I successfully execute the recipe on remote target
|
17
|
-
Then the output must contain "evaluated"
|
18
|
-
|
19
|
-
Scenario: fails when file does not exist
|
20
|
-
When I successfully execute the recipe on remote target
|
21
|
-
Then the output must not contain "evaluated"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `file_contains' condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :file_contains_test do
|
8
|
-
condition { file_contains 'some_file', 'some_content' }
|
9
|
-
|
10
|
-
echo 'evaluated'
|
11
|
-
end
|
12
|
-
"""
|
13
|
-
|
14
|
-
Scenario: succeeds when file contains expected content
|
15
|
-
Given a remote file named "some_file" with "some_content"
|
16
|
-
When I successfully execute the recipe on remote target
|
17
|
-
Then the output must contain "evaluated"
|
18
|
-
|
19
|
-
Scenario: fails when file does not contain expected content
|
20
|
-
Given a remote file named "some_file" with "some_other_content"
|
21
|
-
When I successfully execute the recipe on remote target
|
22
|
-
Then the output must not contain "evaluated"
|
23
|
-
|
24
|
-
Scenario: fails when file does not exist
|
25
|
-
When I successfully execute the recipe on remote target
|
26
|
-
Then the output must not contain "evaluated"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `file_eq' condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :file_eq_test do
|
8
|
-
condition { file_eq 'some_file', 'some content' }
|
9
|
-
|
10
|
-
echo 'evaluated'
|
11
|
-
end
|
12
|
-
"""
|
13
|
-
|
14
|
-
Scenario: succeeds when file content is expected content
|
15
|
-
Given a remote file named "some_file" with "some content"
|
16
|
-
When I successfully execute the recipe on remote target
|
17
|
-
Then the output must contain "evaluated"
|
18
|
-
|
19
|
-
Scenario: fails when file content is not expected content
|
20
|
-
Given a remote file named "some_file" with "some content padded"
|
21
|
-
When I successfully execute the recipe on remote target
|
22
|
-
Then the output must not contain "evaluated"
|
23
|
-
|
24
|
-
Scenario: fails when file does not exist
|
25
|
-
When I successfully execute the recipe on remote target
|
26
|
-
Then the output must not contain "evaluated"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `file_match' condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :file_match_test do
|
8
|
-
condition { file_match 'some_file', /\Asome_content\z/ }
|
9
|
-
|
10
|
-
echo 'evaluated'
|
11
|
-
end
|
12
|
-
"""
|
13
|
-
|
14
|
-
Scenario: succeeds when file match pattern
|
15
|
-
Given a remote file named "some_file" with "some_content"
|
16
|
-
When I successfully execute the recipe on remote target
|
17
|
-
Then the output must contain "evaluated"
|
18
|
-
|
19
|
-
Scenario: fails when file does not match pattern
|
20
|
-
Given a remote file named "some_file" with "some_other_content"
|
21
|
-
When I successfully execute the recipe on remote target
|
22
|
-
Then the output must not contain "evaluated"
|
23
|
-
|
24
|
-
Scenario: fails when file does not exist
|
25
|
-
When I successfully execute the recipe on remote target
|
26
|
-
Then the output must not contain "evaluated"
|
@@ -1,46 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `sh' and `` condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :sh_test_ok do
|
8
|
-
condition { sh 'true' }
|
9
|
-
|
10
|
-
echo 'test_ok'
|
11
|
-
end
|
12
|
-
|
13
|
-
task :sh_test_ko do
|
14
|
-
condition { sh 'false' }
|
15
|
-
|
16
|
-
echo 'test_ko'
|
17
|
-
end
|
18
|
-
|
19
|
-
task :sh_test_backtick_ok do
|
20
|
-
condition { `true` }
|
21
|
-
|
22
|
-
echo 'test_backtick_ok'
|
23
|
-
end
|
24
|
-
|
25
|
-
task :sh_test_backtick_ko do
|
26
|
-
condition { `false` }
|
27
|
-
|
28
|
-
echo 'test_backtick_ko'
|
29
|
-
end
|
30
|
-
"""
|
31
|
-
|
32
|
-
Scenario: succeeds when remote command execution is a success
|
33
|
-
When I successfully execute the recipe on remote target
|
34
|
-
Then the output must contain "test_ok"
|
35
|
-
|
36
|
-
Scenario: fails when remote executable is not available
|
37
|
-
When I successfully execute the recipe on remote target
|
38
|
-
Then the output must not contain "test_ko"
|
39
|
-
|
40
|
-
Scenario: `` alias, succeeds when remote executable is available
|
41
|
-
When I successfully execute the recipe on remote target
|
42
|
-
Then the output must contain "test_backtick_ok"
|
43
|
-
|
44
|
-
Scenario: `` alias, fails when remote executable is not available
|
45
|
-
When I successfully execute the recipe on remote target
|
46
|
-
Then the output must not contain "test_backtick_ko"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
@sshd
|
2
|
-
Feature: `yaml_eq' condition keyword
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given a recipe with:
|
6
|
-
"""
|
7
|
-
task :yaml_eq_test do
|
8
|
-
condition { yaml_eq 'some_file', { foo: 'bar' } }
|
9
|
-
|
10
|
-
echo 'evaluated'
|
11
|
-
end
|
12
|
-
"""
|
13
|
-
|
14
|
-
Scenario: succeeds when YAML data is equivalent
|
15
|
-
Given a remote file named "some_file" with ":foo: bar"
|
16
|
-
When I successfully execute the recipe on remote target
|
17
|
-
Then the output must contain "evaluated"
|
18
|
-
|
19
|
-
Scenario: fails when YAML data differs
|
20
|
-
Given a remote file named "some_file" with ":foo: baz"
|
21
|
-
When I successfully execute the recipe on remote target
|
22
|
-
Then the output must not contain "evaluated"
|
23
|
-
|
24
|
-
Scenario: fails when YAML file does not exist
|
25
|
-
When I successfully execute the recipe on remote target
|
26
|
-
Then the output must not contain "evaluated"
|
data/producer-core.gemspec
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path('../lib/producer/core/version', __FILE__)
|
2
|
-
|
3
|
-
Gem::Specification.new do |s|
|
4
|
-
s.name = 'producer-core'
|
5
|
-
s.version = Producer::Core::VERSION.dup
|
6
|
-
s.summary = 'Provisioning tool'
|
7
|
-
s.description = <<-eoh.gsub(/^ +/, '')
|
8
|
-
Software provisioning tool, including a DSL to write "recipes".
|
9
|
-
eoh
|
10
|
-
s.homepage = 'https://rubygems.org/gems/producer-core'
|
11
|
-
|
12
|
-
s.authors = 'Thibault Jouan'
|
13
|
-
s.email = 'tj@a13.fr'
|
14
|
-
|
15
|
-
s.files = `git ls-files`.split $/
|
16
|
-
s.test_files = s.files.grep /\A(spec|features)\//
|
17
|
-
s.executables = s.files.grep(/\Abin\//) { |f| File.basename(f) }
|
18
|
-
|
19
|
-
|
20
|
-
s.add_dependency 'net-ssh', '~> 2.7'
|
21
|
-
s.add_dependency 'net-sftp', '~> 2.1'
|
22
|
-
|
23
|
-
s.add_development_dependency 'rspec', '~> 3.1'
|
24
|
-
s.add_development_dependency 'cucumber', '~> 2.0'
|
25
|
-
s.add_development_dependency 'aruba', '~> 0.8'
|
26
|
-
s.add_development_dependency 'cucumber-sshd', '~> 1.1.1'
|
27
|
-
s.add_development_dependency 'rake', '~> 10.1'
|
28
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
# can contain tasks written in ruby language.
|
@@ -1 +0,0 @@
|
|
1
|
-
fail Producer::Core::RemoteCommandExecutionError, 'false'
|
@@ -1 +0,0 @@
|
|
1
|
-
throw :recipe_code
|
@@ -1 +0,0 @@
|
|
1
|
-
basic template
|
@@ -1 +0,0 @@
|
|
1
|
-
foo: bar
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= @foo %>
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
describe Action do
|
5
|
-
let(:env) { double 'env'}
|
6
|
-
let(:arguments) { [:some, :arguments] }
|
7
|
-
let(:options) { { foo: :bar } }
|
8
|
-
subject(:action) { described_class.new(env, *arguments, options) }
|
9
|
-
|
10
|
-
it_behaves_like 'action'
|
11
|
-
|
12
|
-
describe '#initialize' do
|
13
|
-
it 'calls #setup when defined' do
|
14
|
-
action_class = Class.new(described_class)
|
15
|
-
action_class.class_eval do
|
16
|
-
define_method(:setup) { @arguments = :other_arguments }
|
17
|
-
end
|
18
|
-
expect(action_class.new(env).arguments).to eq :other_arguments
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '#name' do
|
23
|
-
it 'infers action name from class name' do
|
24
|
-
expect(action.name).to eq 'action'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#to_s' do
|
29
|
-
it 'includes action name' do
|
30
|
-
expect(action.to_s).to match /\A#{action.name}/
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'includes arguments inspection' do
|
34
|
-
expect(action.to_s).to match /#{Regexp.quote(arguments.inspect)}\z/
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'when arguments inspection is very long' do
|
38
|
-
let(:arguments) { [:some, :arguments] * 32 }
|
39
|
-
|
40
|
-
it 'summarizes arguments inspection' do
|
41
|
-
expect(action.to_s.length).to be < 70
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe Echo, :env do
|
6
|
-
let(:text) { 'hello' }
|
7
|
-
let(:arguments) { [text] }
|
8
|
-
subject(:echo) { described_class.new(env, *arguments) }
|
9
|
-
|
10
|
-
it_behaves_like 'action'
|
11
|
-
|
12
|
-
describe '#apply' do
|
13
|
-
it 'writes the given string to env output with a record separator' do
|
14
|
-
echo.apply
|
15
|
-
expect(output).to eq "hello\n"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe FileAppend, :env do
|
6
|
-
let(:path) { 'some_path' }
|
7
|
-
let(:content) { 'some content' }
|
8
|
-
let(:added_content) { ' added' }
|
9
|
-
let(:arguments) { [path, added_content] }
|
10
|
-
subject(:action) { described_class.new(env, *arguments) }
|
11
|
-
|
12
|
-
it_behaves_like 'action'
|
13
|
-
|
14
|
-
before { allow(remote_fs).to receive(:file_read).with(path) { content } }
|
15
|
-
|
16
|
-
describe '#setup' do
|
17
|
-
context 'when content is missing' do
|
18
|
-
let(:added_content) { nil }
|
19
|
-
|
20
|
-
it 'raises ArgumentError' do
|
21
|
-
expect { action }.to raise_error ArgumentError
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '#apply' do
|
27
|
-
it 'appends given content to requested file on remote filesystem' do
|
28
|
-
expect(remote_fs)
|
29
|
-
.to receive(:file_write).with(path, action.combined_content)
|
30
|
-
action.apply
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#combined_content' do
|
35
|
-
it 'returns original content and added content combined' do
|
36
|
-
expect(action.combined_content).to eq 'some content added'
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'when fs.file_read returns nil' do
|
40
|
-
before { allow(remote_fs).to receive(:file_read).with(path) { nil } }
|
41
|
-
|
42
|
-
it 'returns only the added content' do
|
43
|
-
expect(action.combined_content).to eq ' added'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe FileReplaceContent, :env do
|
6
|
-
let(:path) { 'some_path' }
|
7
|
-
let(:pattern) { 'content' }
|
8
|
-
let(:replacement) { 'other content' }
|
9
|
-
let(:content) { 'some content' }
|
10
|
-
let(:arguments) { [path, pattern, replacement] }
|
11
|
-
subject(:action) { described_class.new(env, *arguments) }
|
12
|
-
|
13
|
-
it_behaves_like 'action'
|
14
|
-
|
15
|
-
before { allow(remote_fs).to receive(:file_read).with(path) { content } }
|
16
|
-
|
17
|
-
describe '#setup' do
|
18
|
-
context 'when replacement is missing' do
|
19
|
-
let(:replacement) { nil }
|
20
|
-
|
21
|
-
it 'raises ArgumentError' do
|
22
|
-
expect { action }.to raise_error ArgumentError
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe '#apply' do
|
28
|
-
it 'writes replaced content to file on remote filesystem' do
|
29
|
-
expect(remote_fs)
|
30
|
-
.to receive(:file_write).with(path, action.replaced_content)
|
31
|
-
action.apply
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe '#replaced_content' do
|
36
|
-
it 'returns content with pattern occurrences pattern replaced' do
|
37
|
-
expect(action.replaced_content).to eq 'some other content'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe FileWriter, :env do
|
6
|
-
let(:path) { 'some_path' }
|
7
|
-
let(:content) { 'some_content' }
|
8
|
-
let(:arguments) { [path, content] }
|
9
|
-
let(:options) { { } }
|
10
|
-
subject(:writer) { described_class.new(env, *arguments, options) }
|
11
|
-
|
12
|
-
it_behaves_like 'action'
|
13
|
-
|
14
|
-
describe '#setup' do
|
15
|
-
let(:options) { { mode: 0700, user: 'root' } }
|
16
|
-
|
17
|
-
it 'translates mode option as permissions' do
|
18
|
-
expect(writer.options[:permissions]).to eq 0700
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'translates user option as owner' do
|
22
|
-
expect(writer.options[:owner]).to eq 'root'
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when content is missing' do
|
26
|
-
let(:content) { nil }
|
27
|
-
|
28
|
-
it 'raises ArgumentError' do
|
29
|
-
expect { writer }.to raise_error ArgumentError
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#apply' do
|
35
|
-
it 'writes content to file on remote filesystem' do
|
36
|
-
expect(remote_fs)
|
37
|
-
.to receive(:file_write).with(path, content)
|
38
|
-
writer.apply
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when status options are given' do
|
42
|
-
let(:options) { { group: 'wheel' } }
|
43
|
-
|
44
|
-
it 'changes the directory status with given options' do
|
45
|
-
expect(remote_fs).to receive(:setstat).with(path, options)
|
46
|
-
writer.apply
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe Mkdir, :env do
|
6
|
-
let(:path) { 'some_path' }
|
7
|
-
let(:options) { { } }
|
8
|
-
let(:arguments) { [path] }
|
9
|
-
subject(:mkdir) { described_class.new(env, *arguments, options) }
|
10
|
-
|
11
|
-
it_behaves_like 'action'
|
12
|
-
|
13
|
-
describe '#setup' do
|
14
|
-
let(:options) { { mode: 0700, user: 'root' } }
|
15
|
-
|
16
|
-
it 'translates mode option as permissions' do
|
17
|
-
expect(mkdir.options[:permissions]).to eq 0700
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'translates user option as owner' do
|
21
|
-
expect(mkdir.options[:owner]).to eq 'root'
|
22
|
-
end
|
23
|
-
|
24
|
-
context 'when path is missing' do
|
25
|
-
let(:path) { nil }
|
26
|
-
|
27
|
-
it 'raises ArgumentError' do
|
28
|
-
expect { mkdir }.to raise_error ArgumentError
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#apply' do
|
34
|
-
before { allow(remote_fs).to receive(:dir?) { false } }
|
35
|
-
|
36
|
-
it 'creates directory on remote filesystem' do
|
37
|
-
expect(remote_fs).to receive(:mkdir).with(path)
|
38
|
-
mkdir.apply
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when status options are given' do
|
42
|
-
let(:options) { { group: 'wheel' } }
|
43
|
-
|
44
|
-
it 'changes the directory status with given options' do
|
45
|
-
expect(remote_fs).to receive(:setstat).with(path, options)
|
46
|
-
mkdir.apply
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'when parent directories does not exist' do
|
51
|
-
let(:path) { 'some/path' }
|
52
|
-
|
53
|
-
it 'creates parent directories' do
|
54
|
-
expect(remote_fs).to receive(:mkdir).with('some').ordered
|
55
|
-
expect(remote_fs).to receive(:mkdir).with('some/path').ordered
|
56
|
-
mkdir.apply
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'when directory already exists' do
|
61
|
-
before { allow(remote_fs).to receive(:dir?) { true } }
|
62
|
-
|
63
|
-
it 'does not create any directory' do
|
64
|
-
expect(remote_fs).not_to receive(:mkdir)
|
65
|
-
mkdir.apply
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe ShellCommand, :env do
|
6
|
-
let(:command_args) { 'hello from remote host' }
|
7
|
-
let(:command) { "echo #{command_args}" }
|
8
|
-
let(:arguments) { [command] }
|
9
|
-
subject(:sh) { described_class.new(env, *arguments) }
|
10
|
-
|
11
|
-
it_behaves_like 'action'
|
12
|
-
|
13
|
-
describe '#setup' do
|
14
|
-
context 'when command is missing' do
|
15
|
-
let(:command) { nil }
|
16
|
-
|
17
|
-
it 'raises ArgumentError' do
|
18
|
-
expect { sh }.to raise_error ArgumentError
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '#apply' do
|
24
|
-
it 'executes the remote command' do
|
25
|
-
expect_execution(command)
|
26
|
-
sh.apply
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'writes the returned output' do
|
30
|
-
sh.apply
|
31
|
-
expect(output).to eq "#{command_args}\n"
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'when content is written to standard error' do
|
35
|
-
let(:command) { "echo #{command_args} >&2" }
|
36
|
-
|
37
|
-
it 'writes errors to given error stream' do
|
38
|
-
sh.apply
|
39
|
-
expect(error_output).to eq "#{command_args}\n"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
module Actions
|
5
|
-
describe YAMLWriter, :env do
|
6
|
-
let(:path) { 'some_path' }
|
7
|
-
let(:data) { { foo: 'bar' } }
|
8
|
-
let(:arguments) { [path] }
|
9
|
-
let(:options) { { data: data } }
|
10
|
-
subject(:writer) { described_class.new(env, *arguments, options) }
|
11
|
-
|
12
|
-
it_behaves_like 'action'
|
13
|
-
|
14
|
-
it { is_expected.to be_a FileWriter}
|
15
|
-
|
16
|
-
describe '#apply' do
|
17
|
-
it 'writes data as YAML to file on remote filesystem' do
|
18
|
-
expect(remote_fs)
|
19
|
-
.to receive(:file_write).with(path, data.to_yaml)
|
20
|
-
writer.apply
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|