specinfra 2.88.2 → 2.89.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48bd86bb191af636b611f48c76a248d5171bc0d54573fa7af8063ed6c43aa7ce
4
- data.tar.gz: 249f7068c068d8ce33dea8388408e34eacafe48efe1c3df97392ba91b975ee62
3
+ metadata.gz: 9e50bdeee324833215a1b15370cfc44ef242b6c52dfd9dac888bd2391fb9e7de
4
+ data.tar.gz: a99274248ab6323eea1f84a5692bb73aab86288169e70ee71d743a981b0a5e13
5
5
  SHA512:
6
- metadata.gz: fd3e32a0d9f7157a131436dfb0d28f83cd4937ff01af7bde937c03ef11fe035af03f379d646f456810d5af2b7f404531e87c7a072fa1a06741624bd7b2e20f8d
7
- data.tar.gz: c3daafc7d09fcdd4e665fc8c794a3e61b8267ca7a0b38edf1f6c34d290f80f23cdde69bd56dd49bbeab373e82880cfc40afd8459fe58f6fc33454cd16def6aef
6
+ metadata.gz: 9fa6eacae5f42b7dca7743d83b052e0bdd9e3077649baa0638c3ba9bc7e7f6f3d2f8faa743c5bf3a36fdda7e7d068868f57830cdcf19b33a21f3519aa08a3849
7
+ data.tar.gz: 97227f5e2114863c8afee052c8dd207fa4a2f20bc07b5e4c8b43a030cd44811764f7fb1ab0c16267dfc4bcf2c8968d6b87cd7c0944b567db0f8d0a025edac503
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Specinfra
4
+ module Backend
5
+ # Docker command line transport
6
+ class Dockercli < Exec
7
+ def build_command(cmd)
8
+ docker_cmd = %w[docker exec]
9
+ docker_cmd << '--interactive' if get_config(:interactive_shell)
10
+ docker_cmd << '--tty' if get_config(:request_pty)
11
+ docker_cmd << instance
12
+ (docker_cmd << super(cmd)).join(' ')
13
+ end
14
+
15
+ def send_file(from, to)
16
+ to = Pathname.new(to).dirname.to_s if File.directory?(from)
17
+ cmd = %W[docker cp #{from} #{instance}:#{to}]
18
+ spawn_command(cmd.join(' '))
19
+ end
20
+
21
+ def send_directory(from, to)
22
+ send_file(from, to)
23
+ end
24
+
25
+ private
26
+
27
+ def instance
28
+ raise 'Please specify docker_container' unless (container = get_config(:docker_container))
29
+
30
+ container
31
+ end
32
+ end
33
+ end
34
+ end
@@ -5,6 +5,7 @@ require 'specinfra/backend/powershell/script_helper'
5
5
  require 'specinfra/backend/powershell/command'
6
6
  require 'specinfra/backend/cmd'
7
7
  require 'specinfra/backend/docker'
8
+ require 'specinfra/backend/dockercli'
8
9
  require 'specinfra/backend/lxc'
9
10
  require 'specinfra/backend/lxd'
10
11
  require 'specinfra/backend/winrm'
@@ -1,5 +1,5 @@
1
1
  module Specinfra
2
- VERSION = "2.88.2"
2
+ VERSION = "2.89.0"
3
3
 
4
4
  def self.ruby_is_older_than?(*version)
5
5
  (RUBY_VERSION.split('.').map(&:to_i) <=> version) < 0
data/lib/specinfra.rb CHANGED
@@ -35,6 +35,7 @@ if defined?(RSpec)
35
35
  c.add_setting :scp, :default => nil
36
36
  c.add_setting :sudo_password, :default => nil
37
37
  c.add_setting :winrm, :default => nil
38
+ c.add_setting :docker_container, :default => nil
38
39
  c.add_setting :architecture, :default => :x86_64
39
40
  Specinfra.configuration.defaults.each { |k, v| c.add_setting k, :default => v }
40
41
  c.before :each do
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'shellwords'
5
+
6
+ describe Specinfra::Backend::Dockercli do
7
+ let(:interactive_shell) { false }
8
+ let(:login_shell) { false }
9
+ let(:request_pty) { false }
10
+ let(:shell) { '/bin/sh' }
11
+ let(:docker_container) { 'instance' }
12
+ let(:path) { nil }
13
+ let(:docker_exec) do
14
+ cmd = %w[docker exec]
15
+ cmd << '--interactive' if interactive_shell
16
+ cmd << '--tty' if request_pty
17
+ cmd << docker_container
18
+ cmd << "env PATH=\"#{path}\"" if path
19
+ cmd << shell.shellescape
20
+ cmd << '-i' if interactive_shell
21
+ cmd << '-l' if login_shell
22
+ cmd << '-c'
23
+ cmd.join(' ')
24
+ end
25
+
26
+ before(:each) do
27
+ set :backend, :dockercli
28
+ RSpec.configure do |c|
29
+ c.request_pty = request_pty
30
+ c.interactive_shell = interactive_shell
31
+ c.docker_container = docker_container
32
+ c.path = path
33
+ end
34
+ end
35
+
36
+ after(:each) do
37
+ Specinfra::Backend::Dockercli.clear
38
+ end
39
+
40
+ describe '#build_command' do
41
+ context 'without required docker_container set' do
42
+ let(:docker_container) { nil }
43
+ it {
44
+ expect { subject.build_command('true') }.to raise_error(RuntimeError, /docker_container/)
45
+ }
46
+ end
47
+
48
+ context 'with simple command' do
49
+ it 'should escape spaces' do
50
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
51
+ end
52
+ end
53
+
54
+ context 'with complex command' do
55
+ it 'should escape special chars' do
56
+ expect(subject.build_command('test ! -f /etc/selinux/config || (getenforce | grep -i -- disabled && grep -i -- ^SELINUX=disabled$ /etc/selinux/config)'))
57
+ .to eq "#{docker_exec} test\\ \\!\\ -f\\ /etc/selinux/config\\ \\|\\|\\ \\(getenforce\\ \\|\\ grep\\ -i\\ --\\ disabled\\ \\&\\&\\ grep\\ -i\\ --\\ \\^SELINUX\\=disabled\\$\\ /etc/selinux/config\\)"
58
+ end
59
+
60
+ it 'should escape quotes' do
61
+ if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.7')
62
+ expect(subject.build_command(%Q(find /etc/apt/ -name \*.list | xargs grep -o -E "^deb +[\\"']?http://ppa.launchpad.net/gluster/glusterfs-3.7"))).to eq("#{docker_exec} find\\ /etc/apt/\\ -name\\ \\*.list\\ \\|\\ xargs\\ grep\\ -o\\ -E\\ \\\"\\^deb\\ \\+\\[\\\\\\\"\\'\\]\\?http://ppa.launchpad.net/gluster/glusterfs-3.7\\\"")
63
+ else
64
+ # Since Ruby 2.7, `+` is not escaped.
65
+ expect(subject.build_command(%Q(find /etc/apt/ -name \*.list | xargs grep -o -E "^deb +[\\"']?http://ppa.launchpad.net/gluster/glusterfs-3.7"))).to eq("#{docker_exec} find\\ /etc/apt/\\ -name\\ \\*.list\\ \\|\\ xargs\\ grep\\ -o\\ -E\\ \\\"\\^deb\\ +\\[\\\\\\\"\\'\\]\\?http://ppa.launchpad.net/gluster/glusterfs-3.7\\\"")
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'with custom shell' do
71
+ let(:shell) { '/usr/local/bin/tcsh' }
72
+
73
+ it 'should use custom shell' do
74
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
75
+ end
76
+ end
77
+
78
+ context 'with custom shell that needs escaping' do
79
+ let(:shell) { '/usr/test & spec/bin/sh' }
80
+
81
+ it 'should use custom shell' do
82
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
83
+ end
84
+ end
85
+
86
+ context 'with an interactive shell' do
87
+ let(:interactive_shell) { true }
88
+
89
+ it 'should emulate an interactive shell' do
90
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
91
+ end
92
+ end
93
+
94
+ context 'with an login shell' do
95
+ let(:login_shell) { true }
96
+
97
+ it 'should emulate an login shell' do
98
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
99
+ end
100
+ end
101
+
102
+ context 'with custom path' do
103
+ let(:path) { '/opt/bin:/opt/foo/bin:$PATH' }
104
+
105
+ it 'should use custom path' do
106
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
107
+ end
108
+ end
109
+
110
+ context 'with custom path that needs escaping' do
111
+ let(:path) { '/opt/bin:/opt/test & spec/bin:$PATH' }
112
+
113
+ it 'should use custom path' do
114
+ expect(subject.build_command('test -f /etc/passwd')).to eq "#{docker_exec} test\\ -f\\ /etc/passwd"
115
+ end
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: specinfra
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.88.2
4
+ version: 2.89.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gosuke Miyashita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-06 00:00:00.000000000 Z
11
+ date: 2024-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-scp
@@ -124,6 +124,7 @@ files:
124
124
  - lib/specinfra/backend/base.rb
125
125
  - lib/specinfra/backend/cmd.rb
126
126
  - lib/specinfra/backend/docker.rb
127
+ - lib/specinfra/backend/dockercli.rb
127
128
  - lib/specinfra/backend/dockerfile.rb
128
129
  - lib/specinfra/backend/exec.rb
129
130
  - lib/specinfra/backend/jexec.rb
@@ -515,6 +516,7 @@ files:
515
516
  - lib/specinfra/properties.rb
516
517
  - lib/specinfra/runner.rb
517
518
  - lib/specinfra/version.rb
519
+ - spec/backend/dockercli/build_command_spec.rb
518
520
  - spec/backend/exec/build_command_spec.rb
519
521
  - spec/backend/exec/child_process_spec.rb
520
522
  - spec/backend/exec/consume_exited_process_spec.rb
@@ -665,6 +667,7 @@ test_files:
665
667
  - Gemfile
666
668
  - specinfra.gemspec
667
669
  - Rakefile
670
+ - spec/backend/dockercli/build_command_spec.rb
668
671
  - spec/backend/exec/build_command_spec.rb
669
672
  - spec/backend/exec/child_process_spec.rb
670
673
  - spec/backend/exec/consume_exited_process_spec.rb