r-train 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 382b9412d20998cdc5f4b82977e9fac2a28512e4
4
- data.tar.gz: ef1abbc6f67151829501d9ceefd17631b8f87cd9
3
+ metadata.gz: 4bc131b14e564505bfb4b0fe6600a1cb65683ef6
4
+ data.tar.gz: 7c1e8fe171c13417699bac9e79331e2e5106e9d6
5
5
  SHA512:
6
- metadata.gz: 272fbbdb46cd93991fa1e577fd8124d37d521c3aefeeab2f7ab8f269f39b52ce636afcd79c47d0ceb417fa16b9db3dfb8a03f2c2121b749ce2d27975144f182c
7
- data.tar.gz: 764a07756e3810a0a64934a7fb951adb1021f7e46615b10168bc0dedeb7598435c25cf86067b856f317007e329c6d4183fffe66f4f3593284fd37310bb80eac6
6
+ metadata.gz: cb2560766fb6136b92589b9b0add7f689a7732583168b1453693552986bd7829d5531e0bf431fb85e5c168b2f03e9fb60bdba34d48aa2ab22da09ccf8191776b
7
+ data.tar.gz: 14fd0c7b1d9c9e68dec01cec7ee0f75a7337760ccbfbbe4caf234200b1638dff93b475841755096692db13adb962d1b46aeb5df6f37ef3126a31bd32f798dba0
data/.gitignore CHANGED
@@ -1 +1,4 @@
1
1
  train-*.gem
2
+ r-train-*.gem
3
+ Gemfile.lock
4
+ .kitchen/
data/.travis.yml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
+ sudo: required
2
3
  language: ruby
3
4
  cache: bundler
4
5
 
6
+ # necessary for docker to work
7
+ dist: trusty
8
+ services:
9
+ - docker
10
+
11
+ bundler_args: --without integration tools
12
+
5
13
  matrix:
6
14
  include:
7
15
  - rvm: 1.9.3
@@ -10,3 +18,6 @@ matrix:
10
18
  gemfile: Gemfile
11
19
  - rvm: 2.2
12
20
  gemfile: Gemfile
21
+ - rvm: 2.2
22
+ gemfile: Gemfile
23
+ script: bundle exec rake test:docker config=test/integration/test-runner.yaml
data/CHANGELOG.md ADDED
@@ -0,0 +1,81 @@
1
+ # Change Log
2
+
3
+ ## [0.9.3](https://github.com/chef/train/tree/0.9.3) (2016-01-02)
4
+ [Full Changelog](https://github.com/chef/train/compare/v0.9.2...0.9.3)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Support for local transport on Windows [\#43](https://github.com/chef/train/pull/43) ([chris-rock](https://github.com/chris-rock))
9
+ - Split integration test preparation from executing [\#42](https://github.com/chef/train/pull/42) ([chris-rock](https://github.com/chris-rock))
10
+
11
+ **Merged pull requests:**
12
+
13
+ - introduce `mounted` as a separate method to retrieve the content [\#44](https://github.com/chef/train/pull/44) ([chris-rock](https://github.com/chris-rock))
14
+ - Support for AIX and targeted SSH testing [\#41](https://github.com/chef/train/pull/41) ([foobarbam](https://github.com/foobarbam))
15
+
16
+ ## [v0.9.2](https://github.com/chef/train/tree/v0.9.2) (2015-12-11)
17
+ [Full Changelog](https://github.com/chef/train/compare/v0.9.1...v0.9.2)
18
+
19
+ **Implemented enhancements:**
20
+
21
+ - add changelog [\#38](https://github.com/chef/train/pull/38) ([chris-rock](https://github.com/chris-rock))
22
+ - activate integration tests in travis [\#37](https://github.com/chef/train/pull/37) ([chris-rock](https://github.com/chris-rock))
23
+ - Adding support for Wind River Linux in support of Cisco devices [\#33](https://github.com/chef/train/pull/33) ([adamleff](https://github.com/adamleff))
24
+
25
+ **Fixed bugs:**
26
+
27
+ - Integration test failures [\#34](https://github.com/chef/train/issues/34)
28
+ - Implemented WindowsFile\#exist? [\#36](https://github.com/chef/train/pull/36) ([docwhat](https://github.com/docwhat))
29
+ - adapt integration test to changes in command\_wrapper [\#35](https://github.com/chef/train/pull/35) ([srenatus](https://github.com/srenatus))
30
+
31
+ **Closed issues:**
32
+
33
+ - WinRM plaintext transport is hardcoded \(cannot use SSL\) [\#29](https://github.com/chef/train/issues/29)
34
+
35
+ **Merged pull requests:**
36
+
37
+ - 0.9.2 [\#40](https://github.com/chef/train/pull/40) ([arlimus](https://github.com/arlimus))
38
+ - add rake version helpers [\#39](https://github.com/chef/train/pull/39) ([arlimus](https://github.com/arlimus))
39
+
40
+ ## [v0.9.1](https://github.com/chef/train/tree/v0.9.1) (2015-11-03)
41
+ [Full Changelog](https://github.com/chef/train/compare/0.9.0...v0.9.1)
42
+
43
+ **Implemented enhancements:**
44
+
45
+ - R train [\#27](https://github.com/chef/train/pull/27) ([arlimus](https://github.com/arlimus))
46
+ - Update style of readme [\#26](https://github.com/chef/train/pull/26) ([chris-rock](https://github.com/chris-rock))
47
+ - Add Apache 2.0 License [\#25](https://github.com/chef/train/pull/25) ([jamesc](https://github.com/jamesc))
48
+
49
+ ## [0.9.0](https://github.com/chef/train/tree/0.9.0) (2015-11-03)
50
+ **Implemented enhancements:**
51
+
52
+ - set windows name in :release [\#23](https://github.com/chef/train/pull/23) ([arlimus](https://github.com/arlimus))
53
+ - basic file transport via winrm [\#21](https://github.com/chef/train/pull/21) ([chris-rock](https://github.com/chris-rock))
54
+ - dont return nil on command errors stdout/stderr [\#20](https://github.com/chef/train/pull/20) ([arlimus](https://github.com/arlimus))
55
+ - skip .delivery in gemspec [\#19](https://github.com/chef/train/pull/19) ([arlimus](https://github.com/arlimus))
56
+ - Verify sudo is working and fail with error messages if it isn't [\#18](https://github.com/chef/train/pull/18) ([arlimus](https://github.com/arlimus))
57
+ - improve file eposure [\#16](https://github.com/chef/train/pull/16) ([chris-rock](https://github.com/chris-rock))
58
+ - add delivery [\#13](https://github.com/chef/train/pull/13) ([arlimus](https://github.com/arlimus))
59
+ - Sudo [\#12](https://github.com/chef/train/pull/12) ([arlimus](https://github.com/arlimus))
60
+ - Extract options handling for transport [\#11](https://github.com/chef/train/pull/11) ([arlimus](https://github.com/arlimus))
61
+ - don't let mock commands return nil on stdout or stderr [\#10](https://github.com/chef/train/pull/10) ([arlimus](https://github.com/arlimus))
62
+ - allow mock command to support sha256 mocking of commands [\#9](https://github.com/chef/train/pull/9) ([arlimus](https://github.com/arlimus))
63
+ - register plugins with both names and symbols [\#8](https://github.com/chef/train/pull/8) ([arlimus](https://github.com/arlimus))
64
+ - split of mock into transport and connection [\#7](https://github.com/chef/train/pull/7) ([arlimus](https://github.com/arlimus))
65
+ - bugfix: add docker dependency to gemspec [\#6](https://github.com/chef/train/pull/6) ([arlimus](https://github.com/arlimus))
66
+ - move train/plugins/common to train/extras [\#2](https://github.com/chef/train/pull/2) ([arlimus](https://github.com/arlimus))
67
+ - add Travis [\#1](https://github.com/chef/train/pull/1) ([arlimus](https://github.com/arlimus))
68
+
69
+ **Fixed bugs:**
70
+
71
+ - bugfix: prevent debugging info to stdout on winrm [\#22](https://github.com/chef/train/pull/22) ([arlimus](https://github.com/arlimus))
72
+ - bugfix: fail ssh connections correctly [\#17](https://github.com/chef/train/pull/17) ([arlimus](https://github.com/arlimus))
73
+ - bugfix: initialize mock transport to correct family [\#14](https://github.com/chef/train/pull/14) ([arlimus](https://github.com/arlimus))
74
+
75
+ **Merged pull requests:**
76
+
77
+ - bump train version to 0.9.0 [\#24](https://github.com/chef/train/pull/24) ([chris-rock](https://github.com/chris-rock))
78
+
79
+
80
+
81
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/Gemfile CHANGED
@@ -8,15 +8,17 @@ group :test do
8
8
  gem 'rake', '~> 10'
9
9
  gem 'rubocop', '~> 0.33.0'
10
10
  gem 'simplecov', '~> 0.10'
11
+ gem 'concurrent-ruby', '~> 0.9'
11
12
  end
12
13
 
13
14
  group :integration do
15
+ gem 'berkshelf', '~> 4.0'
14
16
  gem 'test-kitchen', '~> 1.4'
15
17
  gem 'kitchen-vagrant'
16
- gem 'concurrent-ruby', '~> 0.9'
17
18
  end
18
19
 
19
20
  group :tools do
20
21
  gem 'pry', '~> 0.10'
21
22
  gem 'license_finder'
23
+ gem 'github_changelog_generator', '~> 1'
22
24
  end
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env rake
2
2
  # encoding: utf-8
3
3
 
4
+ require 'bundler'
5
+ require 'bundler/gem_tasks'
4
6
  require 'rake/testtask'
5
7
  require 'rubocop/rake_task'
6
8
 
@@ -36,4 +38,110 @@ namespace :test do
36
38
  path = File.join(File.dirname(__FILE__), 'test', 'integration')
37
39
  sh('sh', '-c', "cd #{path} && kitchen test -c #{concurrency}")
38
40
  end
41
+
42
+ # Target required:
43
+ # rake "test:ssh[user@server]"
44
+ # sh -c cd /home/foobarbam/src/gems/train/test/integration \
45
+ # && target=user@server ruby -I ../../lib test_ssh.rb tests/*
46
+ # ...
47
+ # Turn debug logging back on:
48
+ # debug=1 rake "test:ssh[user@server]"
49
+ # Use a different ssh key:
50
+ # key_files=/home/foobarbam/.ssh/id_rsa2 rake "test:ssh[user@server]"
51
+ # Run with a specific test:
52
+ # test=path_block_device_test.rb rake "test:ssh[user@server]"
53
+ task :ssh, [:target] do |t, args|
54
+ path = File.join(File.dirname(__FILE__), 'test', 'integration')
55
+ key_files = ENV['key_files'] || File.join(ENV['HOME'], '.ssh', 'id_rsa')
56
+
57
+ sh_cmd = "cd #{path} && target=#{args[:target]} key_files=#{key_files}"
58
+
59
+ sh_cmd += " debug=#{ENV['debug']}" if ENV['debug']
60
+ sh_cmd += ' ruby -I ../../lib test_ssh.rb tests/'
61
+ sh_cmd += ENV['test'] || '*'
62
+
63
+ sh('sh', '-c', sh_cmd)
64
+ end
65
+ end
66
+
67
+ # Print the current version of this gem or update it.
68
+ #
69
+ # @param [Type] target the new version you want to set, or nil if you only want to show
70
+ def train_version(target = nil)
71
+ path = 'lib/train/version.rb'
72
+ require_relative path.sub(/.rb$/, '')
73
+
74
+ nu_version = target.nil? ? '' : " -> #{target}"
75
+ puts "Train: #{Train::VERSION}#{nu_version}"
76
+
77
+ unless target.nil?
78
+ raw = File.read(path)
79
+ nu = raw.sub(/VERSION.*/, "VERSION = '#{target}'")
80
+ File.write(path, nu)
81
+ load(path)
82
+ end
83
+ end
84
+
85
+ # Automatically generate a changelog for this project. Only loaded if
86
+ # the necessary gem is installed.
87
+ begin
88
+ require 'github_changelog_generator/task'
89
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
90
+ require_relative 'lib/train/version'
91
+ config.future_release = Train::VERSION
92
+ end
93
+ rescue LoadError
94
+ end
95
+
96
+ # Check if a command is available
97
+ #
98
+ # @param [Type] x the command you are interested in
99
+ # @param [Type] msg the message to display if the command is missing
100
+ def require_command(x, msg = nil)
101
+ return if system("command -v #{x} || exit 1")
102
+ msg ||= 'Please install it first!'
103
+ puts "\033[31;1mCan't find command #{x.inspect}. #{msg}\033[0m"
104
+ exit 1
105
+ end
106
+
107
+ # Check if a required environment variable has been set
108
+ #
109
+ # @param [String] x the variable you are interested in
110
+ # @param [String] msg the message you want to display if the variable is missing
111
+ def require_env(x, msg = nil)
112
+ exists = `env | grep "^#{x}="`
113
+ return unless exists.empty?
114
+ puts "\033[31;1mCan't find environment variable #{x.inspect}. #{msg}\033[0m"
115
+ exit 1
116
+ end
117
+
118
+ # Check the requirements for running an update of this repository.
119
+ def check_update_requirements
120
+ require_command 'git'
121
+ require_command 'github_changelog_generator', "\n"\
122
+ "For more information on how to install it see:\n"\
123
+ " https://github.com/skywinder/github-changelog-generator\n"
124
+ require_env 'CHANGELOG_GITHUB_TOKEN', "\n"\
125
+ "Please configure this token to make sure you can run all commands\n"\
126
+ "against GitHub.\n\n"\
127
+ "See github_changelog_generator homepage for more information:\n"\
128
+ " https://github.com/skywinder/github-changelog-generator\n"
129
+ end
130
+
131
+ # Show the current version of this gem.
132
+ desc 'Show the version of this gem'
133
+ task :version do
134
+ train_version
135
+ end
136
+
137
+ # Update the version of this gem and create an updated
138
+ # changelog. It covers everything short of actually releasing
139
+ # the gem.
140
+ desc 'Bump the version of this gem'
141
+ task :bump_version, [:version] do |_, args|
142
+ v = args[:version] || ENV['to']
143
+ fail "You must specify a target version! rake bump_version to=1.2.3" if v.empty?
144
+ check_update_requirements
145
+ train_version(v)
146
+ Rake::Task['changelog'].invoke
39
147
  end
data/lib/train/extras.rb CHANGED
@@ -6,6 +6,7 @@ module Train::Extras
6
6
  autoload :CommandWrapper, 'train/extras/command_wrapper'
7
7
  autoload :FileCommon, 'train/extras/file_common'
8
8
  autoload :LinuxFile, 'train/extras/linux_file'
9
+ autoload :AixFile, 'train/extras/aix_file'
9
10
  autoload :WindowsFile, 'train/extras/windows_file'
10
11
  autoload :OSCommon, 'train/extras/os_common'
11
12
  autoload :Stat, 'train/extras/stat'
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'shellwords'
4
+ require 'train/extras/stat'
5
+
6
+ module Train::Extras
7
+ class AixFile < LinuxFile
8
+ def initialize(backend, path)
9
+ super(backend, path)
10
+ end
11
+
12
+ def content
13
+ return @content if defined?(@content)
14
+ @content = case
15
+ when !exist?, directory?
16
+ nil
17
+ when size.nil?, size == 0
18
+ ''
19
+ else
20
+ @backend.run_command("cat #{@spath}").stdout || ''
21
+ end
22
+ end
23
+
24
+ def link_path
25
+ return nil unless symlink?
26
+ @link_path ||= (
27
+ @backend.run_command("perl -e 'print readlink shift' #{@spath}").stdout.chomp
28
+ )
29
+ end
30
+
31
+ def mounted
32
+ @mounted ||= (
33
+ @backend.run_command("lsfs -c #{@spath}")
34
+ )
35
+ end
36
+ end
37
+ end
@@ -90,16 +90,44 @@ module Train::Extras
90
90
  end
91
91
  end
92
92
 
93
+ # this is required if you run locally on windows,
94
+ # winrm connections provide a PowerShell shell automatically
95
+ # TODO: only activate in local mode
96
+ class PowerShellCommand < CommandWrapperBase
97
+ Train::Options.attach(self)
98
+
99
+ def initialize(backend, options)
100
+ @backend = backend
101
+ validate_options(options)
102
+
103
+ @prefix = 'powershell '
104
+ end
105
+
106
+ def run(command)
107
+ @prefix + command
108
+ end
109
+
110
+ def to_s
111
+ 'PowerShell CommandWrapper'
112
+ end
113
+ end
114
+
93
115
  class CommandWrapper
94
116
  include_options LinuxCommand
95
117
 
96
118
  def self.load(transport, options)
97
- return nil unless LinuxCommand.active?(options)
98
- return nil unless transport.os.unix?
99
- res = LinuxCommand.new(transport, options)
100
- msg = res.verify
101
- fail Train::UserError, "Sudo failed: #{msg}" unless msg.nil?
102
- res
119
+ if transport.os.unix?
120
+ return nil unless LinuxCommand.active?(options)
121
+ res = LinuxCommand.new(transport, options)
122
+ msg = res.verify
123
+ fail Train::UserError, "Sudo failed: #{msg}" unless msg.nil?
124
+ res
125
+ # only use powershell command for local transport. winrm transport
126
+ # uses powershell as default
127
+ elsif transport.os.windows? && transport.class == Train::Transports::Local::Connection
128
+ PowerShellCommand.new(transport, options)
129
+ end
130
+ nil
103
131
  end
104
132
  end
105
133
  end
@@ -102,6 +102,10 @@ module Train::Extras
102
102
  t & o
103
103
  end
104
104
 
105
+ def mounted?
106
+ !mounted.nil? && !mounted.stdout.nil? && !mounted.stdout.empty?
107
+ end
108
+
105
109
  # helper methods provided to any implementing class
106
110
 
107
111
  private
@@ -43,10 +43,9 @@ module Train::Extras
43
43
  )
44
44
  end
45
45
 
46
- def mounted?
46
+ def mounted
47
47
  @mounted ||= (
48
- !@backend.run_command("mount | grep -- ' on #{@spath}'")
49
- .stdout.empty?
48
+ @backend.run_command("mount | grep -- ' on #{@spath}'")
50
49
  )
51
50
  end
52
51
 
@@ -36,7 +36,7 @@ module Train::Extras
36
36
 
37
37
  OS = {
38
38
  'redhat' => %w{
39
- redhat oracle centos fedora amazon scientific xenserver
39
+ redhat oracle centos fedora amazon scientific xenserver wrlinux
40
40
  },
41
41
  'debian' => %w{
42
42
  debian ubuntu linuxmint raspbian
@@ -53,6 +53,9 @@ module Train::Extras
53
53
  'windows' => %w{
54
54
  windows
55
55
  },
56
+ 'aix' => %w{
57
+ aix
58
+ },
56
59
  }
57
60
 
58
61
  OS['linux'] = %w{linux alpine arch coreos exherbo gentoo slackware} +
@@ -11,7 +11,7 @@
11
11
  require 'train/extras/linux_lsb'
12
12
 
13
13
  module Train::Extras
14
- module DetectLinux
14
+ module DetectLinux # rubocop:disable Metrics/ModuleLength
15
15
  include Train::Extras::LinuxLSB
16
16
 
17
17
  def detect_linux_via_config # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
@@ -21,7 +21,7 @@ module Train::Extras
21
21
  elsif !(raw = get_config('/etc/enterprise-release')).nil?
22
22
  @platform[:family] = 'oracle'
23
23
  @platform[:release] = redhatish_version(raw)
24
- elsif !(_raw = get_config('/etc/debian_version')).nil?
24
+ elsif !(raw = get_config('/etc/debian_version')).nil?
25
25
  case lsb[:id]
26
26
  when /ubuntu/i
27
27
  @platform[:family] = 'ubuntu'
@@ -30,11 +30,8 @@ module Train::Extras
30
30
  @platform[:family] = 'linuxmint'
31
31
  @platform[:release] = lsb[:release]
32
32
  else
33
- @platform[:family] = 'debian'
34
- @platform[:family] = 'raspbian' if unix_file?('/usr/bin/raspi-config')
35
- unless (rel = get_config('/etc/debian_version')).nil?
36
- @platform[:release] = rel.chomp
37
- end
33
+ @platform[:family] = unix_file?('/usr/bin/raspi-config') ? 'raspbian' : 'debian'
34
+ @platform[:release] = raw.chomp
38
35
  end
39
36
  elsif !(raw = get_config('/etc/parallels-release')).nil?
40
37
  @platform[:family] = redhatish_platform(raw)
@@ -82,12 +79,14 @@ module Train::Extras
82
79
  @platform[:family] = 'coreos'
83
80
  meta = lsb_config(raw)
84
81
  @platform[:release] = meta[:release]
85
- else
86
- # in all other cases we didn't detect it
87
- return false
82
+ elsif !(os_info = fetch_os_release).nil?
83
+ if os_info['ID_LIKE'].match('wrlinux')
84
+ @platform[:family] = 'wrlinux'
85
+ @platform[:release] = os_info['VERSION']
86
+ end
88
87
  end
89
- # when we get here the detection returned a result
90
- true
88
+
89
+ !@platform[:family].nil? && !@platform[:release].nil?
91
90
  end
92
91
 
93
92
  def uname_s
@@ -122,5 +121,28 @@ module Train::Extras
122
121
  # in all other cases we failed the detection
123
122
  @platform[:family] = 'unknown'
124
123
  end
124
+
125
+ def fetch_os_release
126
+ data = get_config('/etc/os-release')
127
+ return if data.nil?
128
+
129
+ os_info = parse_os_release_info(data)
130
+ cisco_info_file = os_info['CISCO_RELEASE_INFO']
131
+ if cisco_info_file
132
+ os_info.merge!(parse_os_release_info(get_config(cisco_info_file)))
133
+ end
134
+
135
+ os_info
136
+ end
137
+
138
+ def parse_os_release_info(raw)
139
+ return {} if raw.nil?
140
+
141
+ raw.lines.each_with_object({}) do |line, memo|
142
+ line.strip!
143
+ key, value = line.split('=', 2)
144
+ memo[key] = value.gsub(/\A"|"\Z/, '') unless value.empty?
145
+ end
146
+ end
125
147
  end
126
148
  end
@@ -9,6 +9,7 @@
9
9
  #
10
10
 
11
11
  require 'json'
12
+ require 'winrm'
12
13
 
13
14
  module Train::Extras
14
15
  module DetectWindows
@@ -57,7 +58,16 @@ module Train::Extras
57
58
  '-Name OS -Value (Get-WmiObject -Class Win32_OperatingSystem) '\
58
59
  '-PassThru | Add-Member -MemberType NoteProperty -Name OSVersion '\
59
60
  '-Value ([Environment]::OSVersion) -PassThru | ConvertTo-Json'
61
+
62
+ # wrap the script to ensure we always run it via powershell
63
+ # especially in local mode, we cannot be sure that we get a Powershell
64
+ # we may just get a `cmd`. os detection and powershell command wrapper is
65
+ # not available when this code is executed
66
+ script = WinRM::PowershellScript.new(cmd)
67
+ cmd = "powershell -encodedCommand #{script.encoded}"
68
+
60
69
  res = @backend.run_command(cmd)
70
+
61
71
  # TODO: error as this shouldnt be happening at this point
62
72
  return false if res.exit_status != 0 or res.stdout.empty?
63
73
 
@@ -67,6 +77,7 @@ module Train::Extras
67
77
 
68
78
  @platform[:family] = 'windows'
69
79
  @platform[:release] = WINDOWS_VERSIONS[version]
80
+
70
81
  true
71
82
  end
72
83
  end
@@ -20,6 +20,7 @@ module Train::Extras
20
20
  end
21
21
 
22
22
  def self.stat(shell_escaped_path, backend)
23
+ return aix_stat(shell_escaped_path, backend) if backend.os.aix?
23
24
  return bsd_stat(shell_escaped_path, backend) if backend.os.bsd?
24
25
  return linux_stat(shell_escaped_path, backend) if backend.os.unix?
25
26
  # all other cases we don't handle
@@ -88,5 +89,33 @@ module Train::Extras
88
89
  selinux_label: fields[8],
89
90
  }
90
91
  end
92
+
93
+ def self.aix_stat(shell_escaped_path, backend)
94
+ # Perl here b/c it is default on AIX
95
+ stat_cmd = <<-EOP
96
+ perl -e '
97
+ @a = lstat(shift) or exit 2;
98
+ $u = getpwuid($a[4]);
99
+ $g = getgrgid($a[5]);
100
+ printf("0%o\\n%s\\n%s\\n%d\\n%d\\n", $a[2], $u, $g, $a[9], $a[7])
101
+ ' #{shell_escaped_path}
102
+ EOP
103
+
104
+ res = backend.run_command(stat_cmd)
105
+ return {} if res.exit_status != 0
106
+
107
+ fields = res.stdout.split("\n")
108
+ tmask = fields[0].to_i(8)
109
+
110
+ {
111
+ type: find_type(tmask),
112
+ mode: tmask & 00777,
113
+ owner: fields[1],
114
+ group: fields[2],
115
+ mtime: fields[3].to_i,
116
+ size: fields[4].to_i,
117
+ selinux_label: nil,
118
+ }
119
+ end
91
120
  end
92
121
  end
@@ -26,7 +26,9 @@ module Train::Extras
26
26
  end
27
27
 
28
28
  def exist?
29
- nil
29
+ return @exist if defined?(@exist)
30
+ @exist = @backend.run_command(
31
+ "(Test-Path -Path \"#{@spath}\").ToString()").stdout.chomp == 'True'
30
32
  end
31
33
 
32
34
  def link_target
@@ -37,7 +39,7 @@ module Train::Extras
37
39
  nil
38
40
  end
39
41
 
40
- def mounted?
42
+ def mounted
41
43
  nil
42
44
  end
43
45
 
@@ -110,16 +110,22 @@ class Train::Transports::Mock::Connection
110
110
  class File < FileCommon
111
111
  %w{
112
112
  exist? mode owner group link_target link_path content mtime size
113
- selinux_label product_version file_version path
114
- type
113
+ selinux_label product_version file_version path type
115
114
  }.each do |m|
116
115
  attr_accessor m.tr('?', '').to_sym
117
116
  end
118
117
 
119
- def initialize(_runtime, path)
118
+ def initialize(runtime, path)
120
119
  @path = path
121
120
  @type = :unknown
122
121
  @exist = false
122
+ @runtime = runtime
123
+ end
124
+
125
+ def mounted
126
+ @mounted ||= (
127
+ @runtime.run_command("mount | grep -- ' on #{@path}'")
128
+ )
123
129
  end
124
130
  end
125
131
  end
@@ -58,7 +58,13 @@ class Train::Transports::SSH
58
58
  end
59
59
 
60
60
  def file(path)
61
- @files[path] ||= LinuxFile.new(self, path)
61
+ @files[path] ||= \
62
+ case os[:family]
63
+ when 'aix'
64
+ AixFile.new(self, path)
65
+ else
66
+ LinuxFile.new(self, path)
67
+ end
62
68
  end
63
69
 
64
70
  # (see Base::Connection#run_command)
data/lib/train/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # Author:: Dominik Richter (<dominik.richter@gmail.com>)
4
4
 
5
5
  module Train
6
- VERSION = '0.9.1'
6
+ VERSION = '0.9.3'
7
7
  end
@@ -9,38 +9,7 @@
9
9
  # Finally (for now), it actually executes the all tests with
10
10
  # the local execution backend
11
11
 
12
- gid = 'root'
13
- gid = 'wheel' if node['platform_family'] == 'freebsd'
14
-
15
- file '/tmp/file' do
16
- mode '0765'
17
- owner 'root'
18
- group gid
19
- content 'hello world'
20
- end
21
-
22
- directory '/tmp/folder' do
23
- mode '0567'
24
- owner 'root'
25
- group gid
26
- end
27
-
28
- link '/tmp/symlink'do
29
- to '/tmp/file'
30
- owner 'root'
31
- group gid
32
- mode '0777'
33
- end
34
-
35
- execute 'create pipe/fifo' do
36
- command 'mkfifo /tmp/pipe'
37
- not_if 'test -e /tmp/pipe'
38
- end
39
-
40
- execute 'create block_device' do
41
- command "mknod /tmp/block_device b 7 7 && chmod 0666 /tmp/block_device && chown root:#{gid} /tmp/block_device"
42
- not_if 'test -e /tmp/block_device'
43
- end
12
+ include_recipe('test::prep_files')
44
13
 
45
14
  # prepare ssh for backend
46
15
  execute 'create ssh key' do
@@ -78,7 +47,7 @@ end
78
47
 
79
48
  # execute tests
80
49
  execute 'bundle install' do
81
- command '/opt/chef/embedded/bin/bundle install'
50
+ command '/opt/chef/embedded/bin/bundle install --without integration tools'
82
51
  cwd '/tmp/kitchen/data'
83
52
  end
84
53
 
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+ #
5
+ # Helper recipe to create create a few files in the operating
6
+ # systems, which the runner will test against.
7
+
8
+ gid = 'root'
9
+ gid = 'wheel' if node['platform_family'] == 'freebsd'
10
+ gid = 'system' if node['platform_family'] == 'aix'
11
+
12
+ file '/tmp/file' do
13
+ mode '0765'
14
+ owner 'root'
15
+ group gid
16
+ content 'hello world'
17
+ end
18
+
19
+ directory '/tmp/folder' do
20
+ mode '0567'
21
+ owner 'root'
22
+ group gid
23
+ end
24
+
25
+ link '/tmp/symlink'do
26
+ to '/tmp/file'
27
+ owner 'root'
28
+ group gid
29
+ mode '0777'
30
+ end
31
+
32
+ execute 'create pipe/fifo' do
33
+ command 'mkfifo /tmp/pipe'
34
+ not_if 'test -e /tmp/pipe'
35
+ end
36
+
37
+ execute 'create block_device' do
38
+ command "mknod /tmp/block_device b 7 7 && chmod 0666 /tmp/block_device && chown root:#{gid} /tmp/block_device"
39
+ not_if 'test -e /tmp/block_device'
40
+ end
@@ -20,8 +20,11 @@ module Test
20
20
  end
21
21
 
22
22
  def root_group(os)
23
- if os[:family] == 'freebsd'
23
+ case os[:family]
24
+ when 'freebsd'
24
25
  'wheel'
26
+ when 'aix'
27
+ 'system'
25
28
  else
26
29
  'root'
27
30
  end
@@ -10,8 +10,8 @@ describe 'run_command' do
10
10
  end
11
11
 
12
12
  it 'is not running sudo without password' do
13
- run_as('whoami', { sudo: true })
14
- .exit_status.wont_equal 0
13
+ err = ->{Train.create('local', { sudo: true }).connection}.must_raise Train::UserError
14
+ err.message.must_match /Sudo requires a password/
15
15
  end
16
16
 
17
17
  it 'is running passwd sudo' do
@@ -3,13 +3,28 @@
3
3
 
4
4
  require_relative 'helper'
5
5
  require 'train'
6
+ require 'logger'
6
7
 
7
8
  backends = {}
8
9
  backend_conf = {
9
- 'target' => 'ssh://vagrant@localhost',
10
- 'key_files' => '/root/.ssh/id_rsa',
10
+ 'target' => ENV['target'] || 'vagrant@localhost',
11
+ 'key_files' => ENV['key_files'] || '/root/.ssh/id_rsa',
12
+ 'logger' => Logger.new(STDOUT),
11
13
  }
12
14
 
15
+ backend_conf['target'] = 'ssh://' + backend_conf['target']
16
+ backend_conf['logger'].level = \
17
+ if ENV.key?('debug')
18
+ case ENV['debug'].to_s
19
+ when /^false$/i, /^0$/i
20
+ Logger::INFO
21
+ else
22
+ Logger::DEBUG
23
+ end
24
+ else
25
+ Logger::INFO
26
+ end
27
+
13
28
  backends[:ssh] = proc { |*args|
14
29
  conf = Train.target_config(backend_conf)
15
30
  Train.create('ssh', conf).connection(args[0])
@@ -18,7 +18,8 @@ describe 'file interface' do
18
18
  file.type.must_equal(:directory)
19
19
  end
20
20
 
21
- if get_backend.call.os[:family] == 'freebsd'
21
+ case get_backend.call.os[:family]
22
+ when 'freebsd'
22
23
  it 'has freebsd folder content behavior' do
23
24
  file.content.must_equal("\u0003\u0000")
24
25
  end
@@ -30,6 +31,7 @@ describe 'file interface' do
30
31
  it 'has an sha256sum' do
31
32
  file.sha256sum.must_equal('9b4fb24edd6d1d8830e272398263cdbf026b97392cc35387b991dc0248a628f9')
32
33
  end
34
+
33
35
  else
34
36
  it 'has no content' do
35
37
  file.content.must_equal(nil)
@@ -39,3 +39,18 @@ describe 'linux command' do
39
39
  lc.run(cmd).must_equal "echo #{bpw} | base64 -d | sudo -S #{cmd}"
40
40
  end
41
41
  end
42
+
43
+ describe 'powershell command' do
44
+ let(:cls) { Train::Extras::PowerShellCommand }
45
+ let(:cmd) { rand.to_s }
46
+ let(:backend) {
47
+ backend = Train::Transports::Mock.new.connection
48
+ backend.mock_os({ family: 'windows' })
49
+ backend
50
+ }
51
+
52
+ it 'wraps commands in powershell' do
53
+ lc = cls.new(backend, {})
54
+ lc.run(cmd).must_equal "powershell #{cmd}"
55
+ end
56
+ end
@@ -172,6 +172,15 @@ describe 'os common plugin' do
172
172
  it { os.unix?.must_equal(true) }
173
173
  end
174
174
 
175
+ describe 'with platform set to wrlinux' do
176
+ let(:os) { mock_platform('wrlinux') }
177
+ it { os.redhat?.must_equal(true) }
178
+ it { os.debian?.must_equal(false) }
179
+ it { os.suse?.must_equal(false) }
180
+ it { os.linux?.must_equal(true) }
181
+ it { os.unix?.must_equal(true) }
182
+ end
183
+
175
184
  describe 'with platform set to linux' do
176
185
  let(:os) { mock_platform('linux') }
177
186
  it { os.linux?.must_equal(true) }
@@ -0,0 +1,188 @@
1
+ require 'helper'
2
+ require 'train/extras'
3
+
4
+ class OsDetectLinuxTester
5
+ attr_reader :platform
6
+ include Train::Extras::DetectLinux
7
+
8
+ def initialize
9
+ @platform = {}
10
+ end
11
+ end
12
+
13
+ describe 'os_detect_linux' do
14
+ let(:detector) { OsDetectLinuxTester.new }
15
+
16
+ describe '#detect_linux_via_config' do
17
+
18
+ before do
19
+ detector.stubs(:get_config)
20
+ detector.stubs(:fetch_os_release)
21
+ detector.stubs(:redhatish_version).returns('redhat-version')
22
+ end
23
+
24
+ describe '/etc/enterprise-release' do
25
+ it 'sets the correct family/release for oracle' do
26
+ detector.stubs(:get_config).with('/etc/enterprise-release').returns('data')
27
+
28
+ detector.detect_linux_via_config.must_equal(true)
29
+ detector.platform[:family].must_equal('oracle')
30
+ detector.platform[:release].must_equal('redhat-version')
31
+ end
32
+ end
33
+
34
+ describe '/etc/debian_version' do
35
+
36
+ before { detector.stubs(:get_config).with('/etc/debian_version').returns('deb-version') }
37
+
38
+ describe 'ubuntu' do
39
+ it 'sets the correct family/release for ubuntu' do
40
+ detector.stubs(:lsb).returns({ id: 'ubuntu', release: 'ubuntu-release' })
41
+
42
+ detector.detect_linux_via_config.must_equal(true)
43
+ detector.platform[:family].must_equal('ubuntu')
44
+ detector.platform[:release].must_equal('ubuntu-release')
45
+ end
46
+ end
47
+
48
+ describe 'linuxmint' do
49
+ it 'sets the correct family/release for ubuntu' do
50
+ detector.stubs(:lsb).returns({ id: 'linuxmint', release: 'mint-release' })
51
+
52
+ detector.detect_linux_via_config.must_equal(true)
53
+ detector.platform[:family].must_equal('linuxmint')
54
+ detector.platform[:release].must_equal('mint-release')
55
+ end
56
+ end
57
+
58
+ describe 'raspbian' do
59
+ it 'sets the correct family/release for raspbian ' do
60
+ detector.stubs(:lsb).returns({ id: 'something_else', release: 'some_release' })
61
+ detector.expects(:unix_file?).with('/usr/bin/raspi-config').returns(true)
62
+
63
+ detector.detect_linux_via_config.must_equal(true)
64
+ detector.platform[:family].must_equal('raspbian')
65
+ detector.platform[:release].must_equal('deb-version')
66
+ end
67
+ end
68
+
69
+ describe 'everything else' do
70
+ it 'sets the correct family/release for debian ' do
71
+ detector.stubs(:lsb).returns({ id: 'something_else', release: 'some_release' })
72
+ detector.expects(:unix_file?).with('/usr/bin/raspi-config').returns(false)
73
+
74
+ detector.detect_linux_via_config.must_equal(true)
75
+ detector.platform[:family].must_equal('debian')
76
+ detector.platform[:release].must_equal('deb-version')
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '/etc/os-release' do
82
+ describe 'when not on a wrlinux build' do
83
+ it 'does not set a platform family/release' do
84
+ detector.stubs(:fetch_os_release).returns({ 'ID_LIKE' => 'something_else' })
85
+
86
+ detector.detect_linux_via_config.must_equal(false)
87
+ detector.platform[:family].must_equal(nil)
88
+ detector.platform[:release].must_equal(nil)
89
+ end
90
+ end
91
+
92
+ describe 'when on a wrlinux build' do
93
+ let(:data) do
94
+ {
95
+ 'ID_LIKE' => 'cisco-wrlinux',
96
+ 'VERSION' => 'cisco123'
97
+ }
98
+ end
99
+
100
+ it 'sets the correct family/release for wrlinux' do
101
+ detector.stubs(:fetch_os_release).returns(data)
102
+
103
+ detector.detect_linux_via_config.must_equal(true)
104
+ detector.platform[:family].must_equal('wrlinux')
105
+ detector.platform[:release].must_equal('cisco123')
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ describe '#fetch_os_release' do
112
+ describe 'when no os-release data is available' do
113
+ it 'returns nil' do
114
+ detector.expects(:get_config).with('/etc/os-release').returns(nil)
115
+ detector.fetch_os_release.must_equal(nil)
116
+ end
117
+ end
118
+
119
+ describe 'when os-release data exists with no CISCO_RELEASE_INFO' do
120
+ let(:os_release) { { 'KEY1' => 'VALUE1' } }
121
+
122
+ it 'returns a correct hash' do
123
+ detector.expects(:get_config).with('/etc/os-release').returns('os-release data')
124
+ detector.expects(:parse_os_release_info).with('os-release data').returns(os_release)
125
+ detector.fetch_os_release['KEY1'].must_equal('VALUE1')
126
+ end
127
+ end
128
+
129
+ describe 'when os-release data exists with CISCO_RELEASE_INFO' do
130
+ let(:os_release) { { 'KEY1' => 'VALUE1', 'CISCO_RELEASE_INFO' => 'cisco_file' } }
131
+ let(:cisco_release) { { 'KEY1' => 'NEWVALUE1', 'KEY2' => 'VALUE2' } }
132
+
133
+ it 'returns a correct hash' do
134
+ detector.expects(:get_config).with('/etc/os-release').returns('os-release data')
135
+ detector.expects(:get_config).with('cisco_file').returns('cisco data')
136
+ detector.expects(:parse_os_release_info).with('os-release data').returns(os_release)
137
+ detector.expects(:parse_os_release_info).with('cisco data').returns(cisco_release)
138
+
139
+ os_info = detector.fetch_os_release
140
+ os_info['KEY1'].must_equal('NEWVALUE1')
141
+ os_info['KEY2'].must_equal('VALUE2')
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '#parse_os_release_info' do
147
+ describe 'when nil is supplied' do
148
+ it 'returns an empty hash' do
149
+ detector.parse_os_release_info(nil).must_equal({})
150
+ end
151
+ end
152
+
153
+ describe 'when unexpectedly-formatted data is supplied' do
154
+ let(:data) do
155
+ <<-EOL
156
+ blah blah
157
+ no good data here
158
+ EOL
159
+ end
160
+
161
+ it 'returns an empty hash' do
162
+ detector.parse_os_release_info(nil).must_equal({})
163
+ end
164
+ end
165
+
166
+ describe 'when properly-formatted data is supplied' do
167
+ let(:data) do
168
+ <<-EOL
169
+ KEY1=value1
170
+ KEY2=
171
+ KEY3=value3
172
+ KEY4="value4 with spaces"
173
+ KEY5="value5 with a = sign"
174
+ EOL
175
+ end
176
+
177
+ it 'parses the data correctly' do
178
+ parsed_data = detector.parse_os_release_info(data)
179
+
180
+ parsed_data['KEY1'].must_equal('value1')
181
+ parsed_data.key?('KEY2').must_equal(false)
182
+ parsed_data['KEY3'].must_equal('value3')
183
+ parsed_data['KEY4'].must_equal('value4 with spaces')
184
+ parsed_data['KEY5'].must_equal('value5 with a = sign')
185
+ end
186
+ end
187
+ end
188
+ end
data/test/unit/helper.rb CHANGED
@@ -2,5 +2,6 @@
2
2
 
3
3
  require 'minitest/autorun'
4
4
  require 'minitest/spec'
5
+ require 'mocha/setup'
5
6
 
6
7
  require 'train'
@@ -6,6 +6,20 @@
6
6
  require 'helper'
7
7
  require 'train/transports/local'
8
8
 
9
+ # overwrite os detection to simplify mock tests, otherwise run_command tries to
10
+ # determine the OS first and fails the tests
11
+ class Train::Transports::Local::Connection
12
+ class OS < OSCommon
13
+ def initialize(backend)
14
+ super(backend, { family: 'train_mock_os' })
15
+ end
16
+
17
+ def detect_family
18
+ # no op, we do not need to detect the os
19
+ end
20
+ end
21
+ end
22
+
9
23
  describe 'local transport' do
10
24
  let(:transport) { Train::Transports::Local.new }
11
25
  let(:connection) { transport.connection }
@@ -31,11 +45,11 @@ describe 'local transport' do
31
45
  end
32
46
 
33
47
  describe 'when running a local command' do
34
- let(:mock) { Minitest::Mock.new }
48
+ let(:cmd_runner) { Minitest::Mock.new }
35
49
 
36
50
  def mock_run_cmd(cmd, &block)
37
- mock.expect :run_command, nil
38
- Mixlib::ShellOut.stub :new, mock do |*args|
51
+ cmd_runner.expect :run_command, nil
52
+ Mixlib::ShellOut.stub :new, cmd_runner do |*args|
39
53
  block.call()
40
54
  end
41
55
  end
@@ -43,9 +57,9 @@ describe 'local transport' do
43
57
  it 'gets stdout' do
44
58
  mock_run_cmd(rand) do
45
59
  x = rand
46
- mock.expect :stdout, x
47
- mock.expect :stderr, nil
48
- mock.expect :exitstatus, nil
60
+ cmd_runner.expect :stdout, x
61
+ cmd_runner.expect :stderr, nil
62
+ cmd_runner.expect :exitstatus, nil
49
63
  connection.run_command(rand).stdout.must_equal x
50
64
  end
51
65
  end
@@ -53,9 +67,9 @@ describe 'local transport' do
53
67
  it 'gets stderr' do
54
68
  mock_run_cmd(rand) do
55
69
  x = rand
56
- mock.expect :stdout, nil
57
- mock.expect :stderr, x
58
- mock.expect :exitstatus, nil
70
+ cmd_runner.expect :stdout, nil
71
+ cmd_runner.expect :stderr, x
72
+ cmd_runner.expect :exitstatus, nil
59
73
  connection.run_command(rand).stderr.must_equal x
60
74
  end
61
75
  end
@@ -63,9 +77,9 @@ describe 'local transport' do
63
77
  it 'gets exit_status' do
64
78
  mock_run_cmd(rand) do
65
79
  x = rand
66
- mock.expect :stdout, nil
67
- mock.expect :stderr, nil
68
- mock.expect :exitstatus, x
80
+ cmd_runner.expect :stdout, nil
81
+ cmd_runner.expect :stderr, nil
82
+ cmd_runner.expect :exitstatus, x
69
83
  connection.run_command(rand).exit_status.must_equal x
70
84
  end
71
85
  end
@@ -2,6 +2,20 @@
2
2
  require 'helper'
3
3
  require 'train/transports/ssh'
4
4
 
5
+ # overwrite os detection to simplify mock tests, otherwise run_command tries to
6
+ # determine the OS first and fails the tests
7
+ class Train::Transports::SSH::Connection
8
+ class OS < OSCommon
9
+ def initialize(backend)
10
+ super(backend, { family: 'train_mock_os' })
11
+ end
12
+
13
+ def detect_family
14
+ # no op, we do not need to detect the os
15
+ end
16
+ end
17
+ end
18
+
5
19
  describe 'ssh transport' do
6
20
  let(:cls) { Train::Transports::SSH }
7
21
  let(:conf) {{
data/train.gemspec CHANGED
@@ -26,7 +26,8 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'winrm-transport', '~> 1.0'
27
27
  spec.add_dependency 'docker-api', '~> 1.22'
28
28
 
29
- spec.add_development_dependency 'rake', '~> 10.4'
29
+ spec.add_development_dependency 'rake', '~> 10.4'
30
30
  spec.add_development_dependency 'minitest', '~> 5.8'
31
- spec.add_development_dependency 'rubocop', '~> 0.34'
31
+ spec.add_development_dependency 'mocha', '~> 1.1'
32
+ spec.add_development_dependency 'rubocop', '~> 0.34'
32
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r-train
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-03 00:00:00.000000000 Z
11
+ date: 2016-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '5.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: mocha
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.1'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rubocop
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -160,6 +174,7 @@ files:
160
174
  - ".gitignore"
161
175
  - ".rubocop.yml"
162
176
  - ".travis.yml"
177
+ - CHANGELOG.md
163
178
  - Gemfile
164
179
  - LICENSE
165
180
  - README.md
@@ -167,6 +182,7 @@ files:
167
182
  - lib/train.rb
168
183
  - lib/train/errors.rb
169
184
  - lib/train/extras.rb
185
+ - lib/train/extras/aix_file.rb
170
186
  - lib/train/extras/command_wrapper.rb
171
187
  - lib/train/extras/file_common.rb
172
188
  - lib/train/extras/linux_file.rb
@@ -198,6 +214,7 @@ files:
198
214
  - test/integration/chefignore
199
215
  - test/integration/cookbooks/test/metadata.rb
200
216
  - test/integration/cookbooks/test/recipes/default.rb
217
+ - test/integration/cookbooks/test/recipes/prep_files.rb
201
218
  - test/integration/docker_run.rb
202
219
  - test/integration/docker_test.rb
203
220
  - test/integration/docker_test_container.rb
@@ -220,6 +237,7 @@ files:
220
237
  - test/unit/extras/file_common_test.rb
221
238
  - test/unit/extras/linux_file_test.rb
222
239
  - test/unit/extras/os_common_test.rb
240
+ - test/unit/extras/os_detect_linux_test.rb
223
241
  - test/unit/extras/stat_test.rb
224
242
  - test/unit/helper.rb
225
243
  - test/unit/plugins/connection_test.rb
@@ -263,6 +281,7 @@ test_files:
263
281
  - test/integration/chefignore
264
282
  - test/integration/cookbooks/test/metadata.rb
265
283
  - test/integration/cookbooks/test/recipes/default.rb
284
+ - test/integration/cookbooks/test/recipes/prep_files.rb
266
285
  - test/integration/docker_run.rb
267
286
  - test/integration/docker_test.rb
268
287
  - test/integration/docker_test_container.rb
@@ -285,6 +304,7 @@ test_files:
285
304
  - test/unit/extras/file_common_test.rb
286
305
  - test/unit/extras/linux_file_test.rb
287
306
  - test/unit/extras/os_common_test.rb
307
+ - test/unit/extras/os_detect_linux_test.rb
288
308
  - test/unit/extras/stat_test.rb
289
309
  - test/unit/helper.rb
290
310
  - test/unit/plugins/connection_test.rb
@@ -296,4 +316,3 @@ test_files:
296
316
  - test/unit/transports/mock_test.rb
297
317
  - test/unit/transports/ssh_test.rb
298
318
  - test/unit/version_test.rb
299
- has_rdoc: