train 0.32.0 → 1.0.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
  SHA1:
3
- metadata.gz: 6fc74b66a02b98fd67a644a04eb0e5f2186a1826
4
- data.tar.gz: 131969604ad1bc09e8189c341fbbcca6d27c2315
3
+ metadata.gz: '008089b91adad72506c6825bad3e8b4c6837af27'
4
+ data.tar.gz: 7d584e084f13afe3ef7a915cbc7a19ee20597be3
5
5
  SHA512:
6
- metadata.gz: 291bcb6b64d9d02da399f3f99e6d7dbde34cf5049601712559e79b7d4118bf55d78201c9d70564f5f90c7e88ef516f7f59b19ac0046a21c2c1202eb144201a8c
7
- data.tar.gz: e8f7a849c58abfc84bdd01e282b43bef1d6fc2766d26293c9eee414a136ad8b8875b6b0f464cd682a29df81692bfbdc7c13014622442159b51cbac94a13a2611
6
+ metadata.gz: 67d87897890642480be62a48e8bc7571ebf0769f3561d85931bd524317c1503c0c4e4ff4e26b3a1d72e717a4f02c5f660956f741b0663046697d0549b3dd059d
7
+ data.tar.gz: 8c6f4246840527633d22c5aee4947cc17349cf77a8a2f742db541d11f9a371aee4f41825428ee2e163f277aabaae62ce75a5cef8abc406220da0f6b9d01934bf
@@ -1,7 +1,23 @@
1
1
  # Change Log
2
2
 
3
- ## [0.32.0](https://github.com/chef/train/tree/0.32.0) (2018-01-04)
4
- [Full Changelog](https://github.com/chef/train/compare/v0.31.1...0.32.0)
3
+ ## [1.0.0](https://github.com/chef/train/tree/1.0.0) (2018-02-01)
4
+ [Full Changelog](https://github.com/chef/train/compare/v0.32.0...1.0.0)
5
+
6
+ **Closed issues:**
7
+
8
+ - Add aws:// target [\#229](https://github.com/chef/train/issues/229)
9
+
10
+ **Merged pull requests:**
11
+
12
+ - cisco nexus + ios12 [\#247](https://github.com/chef/train/pull/247) ([arlimus](https://github.com/arlimus))
13
+ - Add a CONTRIBUTING.md to Train [\#245](https://github.com/chef/train/pull/245) ([miah](https://github.com/miah))
14
+ - catch detect failing to parse json [\#243](https://github.com/chef/train/pull/243) ([arlimus](https://github.com/arlimus))
15
+ - if ssh closes the session force it to reset and reopen [\#242](https://github.com/chef/train/pull/242) ([arlimus](https://github.com/arlimus))
16
+ - Add AWS transport [\#239](https://github.com/chef/train/pull/239) ([clintoncwolfe](https://github.com/clintoncwolfe))
17
+ - Fix detection of Scientific Linux [\#237](https://github.com/chef/train/pull/237) ([schrd](https://github.com/schrd))
18
+
19
+ ## [v0.32.0](https://github.com/chef/train/tree/v0.32.0) (2018-01-04)
20
+ [Full Changelog](https://github.com/chef/train/compare/v0.31.1...v0.32.0)
5
21
 
6
22
  **Fixed bugs:**
7
23
 
@@ -10,6 +26,7 @@
10
26
 
11
27
  **Merged pull requests:**
12
28
 
29
+ - Release 0.32.0 [\#232](https://github.com/chef/train/pull/232) ([adamleff](https://github.com/adamleff))
13
30
  - Set mock transport to use the platform instance variable [\#230](https://github.com/chef/train/pull/230) ([jquick](https://github.com/jquick))
14
31
 
15
32
  ## [v0.31.1](https://github.com/chef/train/tree/v0.31.1) (2017-12-06)
data/README.md CHANGED
@@ -4,13 +4,14 @@
4
4
  [![Build Status Master](https://ci.appveyor.com/api/projects/status/github/chef/train?branch=master&svg=true&passingText=master%20-%20Ok&pendingText=master%20-%20Pending&failingText=master%20-%20Failing)](https://ci.appveyor.com/project/Chef/train/branch/master)
5
5
  [![Gem Version](https://badge.fury.io/rb/train.svg)](https://badge.fury.io/rb/train)
6
6
 
7
- Train lets you talk to your local or remote operating systems with a unified interface.
7
+ Train lets you talk to your local or remote operating systems and APIs with a unified interface.
8
8
 
9
9
  It allows you to:
10
10
 
11
11
  * execute commands via `run_command`
12
12
  * interact with files via `file`
13
13
  * identify the target operating system via `os`
14
+ * authenticate to API-based services and treat them like a platform
14
15
 
15
16
  Train supports:
16
17
 
@@ -19,6 +20,7 @@ Train supports:
19
20
  * WinRM
20
21
  * Docker
21
22
  * Mock (for testing and debugging)
23
+ * AWS as an API
22
24
 
23
25
  # Examples
24
26
 
@@ -61,6 +63,21 @@ require 'train'
61
63
  train = Train.create('docker', host: 'container_id...')
62
64
  ```
63
65
 
66
+ **AWS**
67
+
68
+ To use AWS API authentication, setup an AWS client profile to store the Access Key ID and Secret Access Key.
69
+
70
+ ```ruby
71
+ require 'train'
72
+ train = Train.create('aws', region: 'us-east-2', profile: 'my-profile')
73
+ ```
74
+
75
+ You may also use the standard AWS CLI environment variables, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION`.
76
+ ```ruby
77
+ require 'train'
78
+ train = Train.create('aws')
79
+ ```
80
+
64
81
  ## Configuration
65
82
 
66
83
  To get a list of available options for a plugin:
@@ -96,6 +113,10 @@ puts conn.os[:release]
96
113
  # access files
97
114
  puts conn.file('/proc/version').content
98
115
 
116
+ # access specific API client functionality
117
+ ec2_client = train.connection.aws_client(Aws::EC2::Client)
118
+ puts ec2_client.describe_instances
119
+
99
120
  # close the connection
100
121
  conn.close
101
122
  ```
@@ -6,6 +6,7 @@ require 'train/platforms/platform'
6
6
  require 'train/platforms/detect'
7
7
  require 'train/platforms/detect/scanner'
8
8
  require 'train/platforms/detect/specifications/os'
9
+ require 'train/platforms/detect/specifications/api'
9
10
 
10
11
  module Train::Platforms
11
12
  class << self
@@ -52,5 +52,23 @@ module Train::Platforms::Detect::Helpers
52
52
  return @uname[:m] if @uname.key?(:m)
53
53
  @uname[:m] = command_output('uname -m')
54
54
  end
55
+
56
+ def cisco_show_version
57
+ return @cache[:cisco] if @cache.key?(:cisco)
58
+ res = command_output('show version')
59
+
60
+ m = res.match(/^Cisco IOS Software, [^,]+? \(([^,]+?)\), Version (\d+\.\d+)/)
61
+ unless m.nil?
62
+ return @cache[:cisco] = { version: m[2], model: m[1], type: 'ios' }
63
+ end
64
+
65
+ m = res.match(/^Cisco Nexus Operating System \(NX-OS\) Software/)
66
+ unless m.nil?
67
+ v = res[/^\s*system:\s+version (\d+\.\d+)/, 1]
68
+ return @cache[:cisco] = { version: v, type: 'nexus' }
69
+ end
70
+
71
+ @cache[:cisco] = nil
72
+ end
55
73
  end
56
74
  end
@@ -15,6 +15,7 @@ module Train::Platforms::Detect
15
15
  @files = {}
16
16
  @uname = {}
17
17
  @lsb = {}
18
+ @cache = {}
18
19
  end
19
20
 
20
21
  # Main detect method to scan all platforms for a match
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module Train::Platforms::Detect::Specifications
4
+ class Api
5
+ def self.load
6
+ plat = Train::Platforms
7
+
8
+ plat.family('api')
9
+ plat.family('cloud').in_family('api')
10
+ plat.name('aws').in_family('cloud')
11
+ end
12
+ end
13
+ end
@@ -27,12 +27,38 @@ module Train::Platforms::Detect::Specifications
27
27
  # unix master family
28
28
  plat.family('unix')
29
29
  .detect {
30
- if unix_uname_s =~ /./
30
+ # we want to catch a special case here where cisco commands
31
+ # don't return an exit status and still print to stdout
32
+ if unix_uname_s =~ /./ && !unix_uname_s.start_with?('Line has invalid autocommand ')
31
33
  @platform[:arch] = unix_uname_m
32
34
  true
33
35
  end
34
36
  }
35
37
 
38
+ # cisco_ios family
39
+ plat.family('cisco').title('Cisco Family')
40
+ .detect {
41
+ !cisco_show_version.nil?
42
+ }
43
+
44
+ plat.name('cisco_ios').title('Cisco IOS').in_family('cisco')
45
+ .detect {
46
+ v = cisco_show_version
47
+ next unless v[:type] == 'ios'
48
+ @platform[:release] = v[:version]
49
+ @platform[:arch] = nil
50
+ true
51
+ }
52
+
53
+ plat.name('cisco_nexus').title('Cisco Nexus').in_family('cisco')
54
+ .detect {
55
+ v = cisco_show_version
56
+ next unless v[:type] == 'nexus'
57
+ @platform[:release] = v[:version]
58
+ @platform[:arch] = nil
59
+ true
60
+ }
61
+
36
62
  # arista_eos family
37
63
  # this has to be before redhat as EOS is based off fedora
38
64
  plat.family('arista_eos').title('Arista EOS Family').in_family('unix')
@@ -46,10 +72,14 @@ module Train::Platforms::Detect::Specifications
46
72
  cmd = @backend.run_command('show version | json')
47
73
  if cmd.exit_status == 0 && !cmd.stdout.empty?
48
74
  require 'json'
49
- eos_ver = JSON.parse(cmd.stdout)
50
- @platform[:release] = eos_ver['version']
51
- @platform[:arch] = eos_ver['architecture']
52
- true
75
+ begin
76
+ eos_ver = JSON.parse(cmd.stdout)
77
+ @platform[:release] = eos_ver['version']
78
+ @platform[:arch] = eos_ver['architecture']
79
+ true
80
+ rescue JSON::ParserError
81
+ nil
82
+ end
53
83
  end
54
84
  }
55
85
  plat.name('arista_eos_bash').title('Arista EOS Bash Shell').in_family('arista_eos')
@@ -58,10 +88,14 @@ module Train::Platforms::Detect::Specifications
58
88
  cmd = @backend.run_command('FastCli -p 15 -c "show version | json"')
59
89
  if cmd.exit_status == 0 && !cmd.stdout.empty?
60
90
  require 'json'
61
- eos_ver = JSON.parse(cmd.stdout)
62
- @platform[:release] = eos_ver['version']
63
- @platform[:arch] = eos_ver['architecture']
64
- true
91
+ begin
92
+ eos_ver = JSON.parse(cmd.stdout)
93
+ @platform[:release] = eos_ver['version']
94
+ @platform[:arch] = eos_ver['architecture']
95
+ true
96
+ rescue JSON::ParserError
97
+ nil
98
+ end
65
99
  end
66
100
  end
67
101
  }
@@ -158,7 +192,7 @@ module Train::Platforms::Detect::Specifications
158
192
  plat.name('scientific').title('Scientific Linux').in_family('redhat')
159
193
  .detect {
160
194
  lsb = read_linux_lsb
161
- if lsb && lsb[:id] =~ /scientificsl/i
195
+ if lsb && lsb[:id] =~ /scientific/i
162
196
  @platform[:release] = lsb[:release]
163
197
  true
164
198
  end
@@ -23,6 +23,7 @@ class Train::Plugins::Transport
23
23
  @options = options || {}
24
24
  @logger = @options.delete(:logger) || Logger.new(STDOUT)
25
25
  Train::Platforms::Detect::Specifications::OS.load
26
+ Train::Platforms::Detect::Specifications::Api.load
26
27
 
27
28
  # default caching options
28
29
  @cache_enabled = {
@@ -76,6 +77,20 @@ class Train::Plugins::Transport
76
77
  false
77
78
  end
78
79
 
80
+ def direct_platform(name)
81
+ plat = Train::Platforms.name(name)
82
+ plat.backend = self
83
+ plat.family_hierarchy = family_hierarchy(plat).flatten
84
+ plat
85
+ end
86
+
87
+ def family_hierarchy(plat)
88
+ plat.families.each_with_object([]) do |(k, _v), memo|
89
+ memo << k.name
90
+ memo << family_hierarchy(k) unless k.families.empty?
91
+ end
92
+ end
93
+
79
94
  # Get information on the operating system which this transport connects to.
80
95
  #
81
96
  # @return [Platform] system information
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ require 'train/plugins'
3
+ require 'aws-sdk'
4
+
5
+ module Train::Transports
6
+ class Aws < Train.plugin(1)
7
+ name 'aws'
8
+ option :region, required: true, default: ENV['AWS_REGION']
9
+ option :access_key_id, default: ENV['AWS_ACCESS_KEY_ID']
10
+ option :secret_access_key, default: ENV['AWS_SECRET_ACCESS_KEY']
11
+ option :session_token, default: ENV['AWS_SESSION_TOKEN']
12
+
13
+ # This can provide the access key id and secret access key
14
+ option :profile, default: ENV['AWS_PROFILE']
15
+
16
+ def connection(_ = nil)
17
+ @connection ||= Connection.new(@options)
18
+ end
19
+
20
+ class Connection < BaseConnection
21
+ def initialize(options)
22
+ # Override for any cli options
23
+ # aws://region/my-profile
24
+ options[:region] = options[:host] || options[:region]
25
+ if options[:path]
26
+ # string the leading / from path
27
+ options[:profile] = options[:path][1..-1]
28
+ end
29
+ super(options)
30
+
31
+ @cache_enabled[:api_call] = true
32
+ @cache[:api_call] = {}
33
+
34
+ connect
35
+ end
36
+
37
+ def platform
38
+ direct_platform('aws')
39
+ end
40
+
41
+ def aws_client(klass)
42
+ return klass.new unless cache_enabled?(:api_call)
43
+ @cache[:api_call][klass.to_s.to_sym] ||= klass.new
44
+ end
45
+
46
+ def aws_resource(klass, args)
47
+ klass.new(args)
48
+ end
49
+
50
+ def connect
51
+ ENV['AWS_PROFILE'] = @options[:profile] if @options[:profile]
52
+ ENV['AWS_REGION'] = @options[:region] if @options[:region]
53
+ end
54
+
55
+ def uri
56
+ "aws://#{@options[:region]}"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -75,19 +75,12 @@ class Train::Transports::Mock
75
75
  value = { name: 'mock', family: 'mock', release: 'unknown', arch: 'unknown' }.merge(value)
76
76
 
77
77
  platform = Train::Platforms.name(value[:name])
78
- platform.family_hierarchy = mock_os_hierarchy(platform).flatten
78
+ platform.family_hierarchy = family_hierarchy(platform).flatten
79
79
  platform.platform = value
80
80
  platform.add_platform_methods
81
81
  @platform = platform
82
82
  end
83
83
 
84
- def mock_os_hierarchy(plat)
85
- plat.families.each_with_object([]) do |(k, _v), memo|
86
- memo << k.name
87
- memo << mock_os_hierarchy(k) unless k.families.empty?
88
- end
89
- end
90
-
91
84
  def commands=(commands)
92
85
  @cache[:command] = commands
93
86
  end
@@ -182,6 +182,7 @@ class Train::Transports::SSH
182
182
  cmd.dup.force_encoding('binary') if cmd.respond_to?(:force_encoding)
183
183
  logger.debug("[SSH] #{self} (#{cmd})")
184
184
 
185
+ reset_session if session.closed?
185
186
  session.open_channel do |channel|
186
187
  # wrap commands if that is configured
187
188
  cmd = @cmd_wrapper.run(cmd) unless @cmd_wrapper.nil?
@@ -232,6 +233,10 @@ class Train::Transports::SSH
232
233
  }.merge(retry_options))
233
234
  end
234
235
 
236
+ def reset_session
237
+ @session = nil
238
+ end
239
+
235
240
  # String representation of object, reporting its connection details and
236
241
  # configuration.
237
242
  #
@@ -3,5 +3,5 @@
3
3
  # Author:: Dominik Richter (<dominik.richter@gmail.com>)
4
4
 
5
5
  module Train
6
- VERSION = '0.32.0'.freeze
6
+ VERSION = '1.0.0'.freeze
7
7
  end
@@ -44,6 +44,16 @@ describe 'os_detect' do
44
44
  platform[:family].must_equal('redhat')
45
45
  platform[:release].must_equal('7.2.1511')
46
46
  end
47
+ it 'sets the correct family, name, and release on scientific linux' do
48
+ files = {
49
+ '/etc/redhat-release' => "Scientific Linux release 7.4 (Nitrogen)\n",
50
+ '/etc/os-release' => "NAME=\"Scientific Linux\"\nVERSION=\"7.4 (Nitrogen)\"\nID=\"rhel\"\nID_LIKE=\"scientific centos fedora\"\nVERSION_ID=\"7.4\"\nPRETTY_NAME=\"Scientific Linux 7.4 (Nitrogen)\"\nANSI_COLOR=\"0;31\"\nCPE_NAME=\"cpe:/o:scientificlinux:scientificlinux:7.4:GA\"\nHOME_URL=\"http://www.scientificlinux.org//\"\nBUG_REPORT_URL=\"mailto:scientific-linux-devel@listserv.fnal.gov\"\n\nREDHAT_BUGZILLA_PRODUCT=\"Scientific Linux 7\"\nREDHAT_BUGZILLA_PRODUCT_VERSION=7.4\nREDHAT_SUPPORT_PRODUCT=\"Scientific Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"7.4\"\n",
51
+ }
52
+ platform = scan_with_files('linux', files)
53
+ platform[:name].must_equal('scientific')
54
+ platform[:family].must_equal('redhat')
55
+ platform[:release].must_equal('7.4')
56
+ end
47
57
  end
48
58
  end
49
59
 
@@ -172,4 +182,26 @@ describe 'os_detect' do
172
182
  end
173
183
  end
174
184
  end
185
+
186
+ describe 'cisco' do
187
+ it 'recognizes Cisco IOS12' do
188
+ mock = Train::Transports::Mock::Connection.new
189
+ mock.mock_command('show version', "Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 12.2(58)SE")
190
+ platform = Train::Platforms::Detect.scan(mock)
191
+
192
+ platform[:name].must_equal('cisco_ios')
193
+ platform[:family].must_equal('cisco')
194
+ platform[:release].must_equal('12.2')
195
+ end
196
+
197
+ it 'recognizes Cisco Nexus' do
198
+ mock = Train::Transports::Mock::Connection.new
199
+ mock.mock_command('show version', "Cisco Nexus Operating System (NX-OS) Software\n system: version 5.2(1)N1(8b)\n")
200
+ platform = Train::Platforms::Detect.scan(mock)
201
+
202
+ platform[:name].must_equal('cisco_nexus')
203
+ platform[:family].must_equal('cisco')
204
+ platform[:release].must_equal('5.2')
205
+ end
206
+ end
175
207
  end
@@ -43,6 +43,18 @@ describe 'v1 Connection Plugin' do
43
43
  .must_be_instance_of(Logger)
44
44
  end
45
45
 
46
+ it 'provides direct platform' do
47
+ plat = connection.direct_platform('linux')
48
+ plat.name.must_equal 'linux'
49
+ plat.family_hierarchy.must_equal ['linux', 'unix']
50
+ end
51
+
52
+ it 'provides family hierarchy' do
53
+ plat = Train::Platforms.name('linux')
54
+ family = connection.family_hierarchy(plat)
55
+ family.flatten.must_equal ['linux', 'unix']
56
+ end
57
+
46
58
  it 'must use the user-provided logger' do
47
59
  l = rand
48
60
  cls.new({logger: l})
@@ -0,0 +1,99 @@
1
+ # encoding: utf-8
2
+
3
+ require 'helper'
4
+
5
+ describe 'aws transport' do
6
+ def transport(options = nil)
7
+ ENV['AWS_REGION'] = 'test_region'
8
+ ENV['AWS_ACCESS_KEY_ID'] = 'test_key_id'
9
+ ENV['AWS_SECRET_ACCESS_KEY'] = 'test_access_key'
10
+ ENV['AWS_SESSION_TOKEN'] = 'test_session_token'
11
+
12
+ # need to require this at here as it captures the envs on load
13
+ require 'train/transports/aws'
14
+ Train::Transports::Aws.new(options)
15
+ end
16
+ let(:connection) { transport.connection }
17
+ let(:options) { connection.instance_variable_get(:@options) }
18
+ let(:cache) { connection.instance_variable_get(:@cache) }
19
+
20
+ describe 'options' do
21
+ it 'defaults to env options' do
22
+ options[:region].must_equal 'test_region'
23
+ options[:access_key_id].must_equal 'test_key_id'
24
+ options[:secret_access_key].must_equal 'test_access_key'
25
+ options[:session_token].must_equal 'test_session_token'
26
+ end
27
+
28
+ it 'test options override' do
29
+ transport = transport(region: 'us-east-2', access_key_id: '8')
30
+ options = transport.connection.instance_variable_get(:@options)
31
+ options[:region].must_equal 'us-east-2'
32
+ options[:access_key_id].must_equal '8'
33
+ options[:secret_access_key].must_equal 'test_access_key'
34
+ options[:session_token].must_equal 'test_session_token'
35
+ end
36
+
37
+ it 'test url parse override' do
38
+ transport = transport(host: 'us-east-2')
39
+ options = transport.connection.instance_variable_get(:@options)
40
+ options[:region].must_equal 'us-east-2'
41
+ options[:session_token].must_equal 'test_session_token'
42
+ end
43
+ end
44
+
45
+ describe 'platform' do
46
+ it 'returns platform' do
47
+ plat = connection.platform
48
+ plat.name.must_equal 'aws'
49
+ plat.family_hierarchy.must_equal ['cloud', 'api']
50
+ end
51
+ end
52
+
53
+ describe 'aws_client' do
54
+ it 'test aws_client with caching' do
55
+ client = connection.aws_client(Object)
56
+ client.is_a?(Object).must_equal true
57
+ cache[:api_call].count.must_equal 1
58
+ end
59
+
60
+ it 'test aws_client without caching' do
61
+ connection.disable_cache(:api_call)
62
+ client = connection.aws_client(Object)
63
+ client.is_a?(Object).must_equal true
64
+ cache[:api_call].count.must_equal 0
65
+ end
66
+ end
67
+
68
+ describe 'aws_resource' do
69
+ class AwsResource
70
+ attr_reader :hash
71
+ def initialize(hash)
72
+ @hash = hash
73
+ end
74
+ end
75
+
76
+ it 'test aws_resource with arguments' do
77
+ hash = { user: 1, name: 'test_user' }
78
+ resource = connection.aws_resource(AwsResource, hash)
79
+ resource.hash.must_equal hash
80
+ cache[:api_call].count.must_equal 0
81
+ end
82
+ end
83
+
84
+ describe 'connect' do
85
+ it 'validate aws connection with profile' do
86
+ options[:profile] = 'xyz'
87
+ ENV['AWS_PROFILE'].must_be_nil
88
+ connection.connect
89
+ ENV['AWS_PROFILE'].must_equal 'xyz'
90
+ end
91
+
92
+ it 'validate aws connection with region' do
93
+ options[:region] = 'xyz'
94
+ ENV['AWS_REGION'].must_equal 'test_region'
95
+ connection.connect
96
+ ENV['AWS_REGION'].must_equal 'xyz'
97
+ end
98
+ end
99
+ end
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency 'winrm', '~> 2.0'
34
34
  spec.add_dependency 'winrm-fs', '~> 1.0'
35
35
  spec.add_dependency 'docker-api', '~> 1.26'
36
+ spec.add_dependency 'aws-sdk', '~> 2'
36
37
 
37
38
  spec.add_development_dependency 'mocha', '~> 1.1'
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: train
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.32.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-04 00:00:00.000000000 Z
11
+ date: 2018-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -120,6 +120,20 @@ dependencies:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
122
  version: '1.26'
123
+ - !ruby/object:Gem::Dependency
124
+ name: aws-sdk
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '2'
130
+ type: :runtime
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '2'
123
137
  - !ruby/object:Gem::Dependency
124
138
  name: mocha
125
139
  requirement: !ruby/object:Gem::Requirement
@@ -170,12 +184,14 @@ files:
170
184
  - lib/train/platforms/detect/helpers/os_linux.rb
171
185
  - lib/train/platforms/detect/helpers/os_windows.rb
172
186
  - lib/train/platforms/detect/scanner.rb
187
+ - lib/train/platforms/detect/specifications/api.rb
173
188
  - lib/train/platforms/detect/specifications/os.rb
174
189
  - lib/train/platforms/family.rb
175
190
  - lib/train/platforms/platform.rb
176
191
  - lib/train/plugins.rb
177
192
  - lib/train/plugins/base_connection.rb
178
193
  - lib/train/plugins/transport.rb
194
+ - lib/train/transports/aws.rb
179
195
  - lib/train/transports/docker.rb
180
196
  - lib/train/transports/local.rb
181
197
  - lib/train/transports/mock.rb
@@ -237,6 +253,7 @@ files:
237
253
  - test/unit/plugins/transport_test.rb
238
254
  - test/unit/plugins_test.rb
239
255
  - test/unit/train_test.rb
256
+ - test/unit/transports/aws_test.rb
240
257
  - test/unit/transports/local_test.rb
241
258
  - test/unit/transports/mock_test.rb
242
259
  - test/unit/transports/ssh_test.rb
@@ -264,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
281
  version: '0'
265
282
  requirements: []
266
283
  rubyforge_project:
267
- rubygems_version: 2.6.11
284
+ rubygems_version: 2.5.2
268
285
  signing_key:
269
286
  specification_version: 4
270
287
  summary: Transport interface to talk to different backends.
@@ -322,6 +339,7 @@ test_files:
322
339
  - test/unit/plugins/transport_test.rb
323
340
  - test/unit/plugins_test.rb
324
341
  - test/unit/train_test.rb
342
+ - test/unit/transports/aws_test.rb
325
343
  - test/unit/transports/local_test.rb
326
344
  - test/unit/transports/mock_test.rb
327
345
  - test/unit/transports/ssh_test.rb