Support `mkdir' status attributes

This commit is contained in:
Thibault Jouan 2014-10-08 11:21:32 +00:00
parent 6f2ff17b94
commit a84b34b7ca
7 changed files with 53 additions and 33 deletions

View File

@ -6,8 +6,8 @@ Feature: `mkdir' task action
""" """
task :mkdir_action do task :mkdir_action do
mkdir 'some_directory' mkdir 'some_directory'
mkdir 'some_directory_0700', 0700 mkdir 'some_directory_0700', mode: 0700
mkdir 'some_directory_0500', 0500 mkdir 'some_directory_0711', mode: 0711
end end
""" """
@ -15,10 +15,10 @@ Feature: `mkdir' task action
When I successfully execute the recipe on remote target When I successfully execute the recipe on remote target
Then the remote directory "some_directory" must exists Then the remote directory "some_directory" must exists
Scenario: creates directory with given permissions Scenario: creates directory with given attributes
When I successfully execute the recipe on remote target When I successfully execute the recipe on remote target
Then the remote directory "some_directory_0700" must have 0700 mode Then the remote directory "some_directory_0700" must have 0700 mode
And the remote directory "some_directory_0500" must have 0500 mode And the remote directory "some_directory_0711" must have 0711 mode
Scenario: creates directories recursively Scenario: creates directories recursively
Given a recipe with: Given a recipe with:

View File

@ -7,11 +7,12 @@ module Producer
def_delegators :@env, :input, :output, :error_output, :remote def_delegators :@env, :input, :output, :error_output, :remote
def_delegators :remote, :fs def_delegators :remote, :fs
attr_reader :env, :arguments attr_reader :env, :arguments, :options
def initialize(env, *args) def initialize(env, *args, **options)
@env = env @env = env
@arguments = args @arguments = args
@options = options
end end
def name def name

View File

@ -2,6 +2,12 @@ module Producer
module Core module Core
module Actions module Actions
class Mkdir < Action class Mkdir < Action
def initialize(env, *args, **options)
super
@options[:permissions] = @options.delete :mode if @options.key? :mode
@options[:owner] = @options.delete :user if @options.key? :user
end
def name def name
'mkdir' 'mkdir'
end end
@ -10,7 +16,7 @@ module Producer
path.descend do |p| path.descend do |p|
next if fs.dir? p next if fs.dir? p
fs.mkdir p.to_s fs.mkdir p.to_s
fs.chmod p.to_s, mode if mode fs.setstat p.to_s, @options unless @options.empty?
end end
end end
@ -20,10 +26,6 @@ module Producer
def path def path
Pathname.new(arguments.first) Pathname.new(arguments.first)
end end
def mode
arguments[1]
end
end end
end end
end end

View File

@ -20,13 +20,16 @@ module Producer
false false
end end
def chmod(path, mode) def setstat(path, attributes)
sftp.setstat! path, permissions: mode sftp.setstat! path, attributes
end end
def mkdir(path, mode = nil) def chmod(path, mode)
options = mode ? { permissions: mode } : {} setstat path, permissions: mode
sftp.mkdir! path, options end
def mkdir(path, attributes = {})
ret = sftp.mkdir! path, attributes
end end
def file_read(path) def file_read(path)

View File

@ -4,10 +4,23 @@ module Producer::Core
module Actions module Actions
describe Mkdir, :env do describe Mkdir, :env do
let(:path) { 'some_path' } let(:path) { 'some_path' }
subject(:mkdir) { described_class.new(env, path) } let(:options) { { } }
subject(:mkdir) { described_class.new(env, path, options) }
it_behaves_like 'action' it_behaves_like 'action'
describe '#initialize' do
let(:options) { { mode: 0700, user: 'root' } }
it 'translates mode option as permissions' do
expect(mkdir.options[:permissions]).to eq 0700
end
it 'translates user option as owner' do
expect(mkdir.options[:owner]).to eq 'root'
end
end
describe '#apply' do describe '#apply' do
before { allow(remote_fs).to receive(:dir?) { false } } before { allow(remote_fs).to receive(:dir?) { false } }
@ -16,11 +29,11 @@ module Producer::Core
mkdir.apply mkdir.apply
end end
context 'when a mode was given' do context 'when status options are given' do
subject(:mkdir) { described_class.new(env, path, 0700) } let(:options) { { group: 'wheel' } }
it 'changes the directory with given mode' do it 'changes the directory status with given options' do
expect(remote_fs).to receive(:chmod).with(path, 0700) expect(remote_fs).to receive(:setstat).with(path, options)
mkdir.apply mkdir.apply
end end
end end
@ -38,7 +51,7 @@ module Producer::Core
context 'when directory already exists' do context 'when directory already exists' do
before { allow(remote_fs).to receive(:dir?) { true } } before { allow(remote_fs).to receive(:dir?) { true } }
it 'creates directory on remote filesystem' do it 'does not create any directory' do
expect(remote_fs).not_to receive(:mkdir) expect(remote_fs).not_to receive(:mkdir)
mkdir.apply mkdir.apply
end end

View File

@ -86,18 +86,12 @@ module Producer::Core
end end
describe '#mkdir' do describe '#mkdir' do
let(:path) { 'some_directory_path' } let(:path) { 'some_directory_path' }
let(:attributes) { { foo: :bar } }
it 'creates the directory' do it 'creates the directory' do
expect(sftp).to receive(:mkdir!).with(path, anything) expect(sftp).to receive(:mkdir!).with(path, attributes)
fs.mkdir path fs.mkdir path, attributes
end
it 'specifies permissions from optional mode argument' do
expect(sftp).to receive(:mkdir!) do |_, options|
expect(options[:permissions]).to eq 0700
end
fs.mkdir path, 0700
end end
end end

View File

@ -3,7 +3,8 @@ module Producer::Core
include TestEnvHelpers include TestEnvHelpers
let(:arguments) { [:some, :arguments] } let(:arguments) { [:some, :arguments] }
subject(:action) { described_class.new(env, *arguments) } let(:options) { { foo: :bar } }
subject(:action) { described_class.new(env, *arguments, options) }
describe '#env' do describe '#env' do
it 'returns the assigned env' do it 'returns the assigned env' do
@ -17,6 +18,12 @@ module Producer::Core
end end
end end
describe '#options' do
it 'returns the assigned options' do
expect(action.options).to eq options
end
end
describe '#input' do describe '#input' do
it 'returns env input' do it 'returns env input' do
expect(action.input).to be env.input expect(action.input).to be env.input