r-train 0.9.1 → 0.9.3

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
  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: