train 0.32.0 → 1.0.0

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