cartage-remote 2.0 → 2.1

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: 6b8d946cbacde570be1b25b925b1b4b0c008d5bc
4
- data.tar.gz: 16e8bb54b6c41dc3b35e5a8e16fab73851174d35
3
+ metadata.gz: 57c1a21e0b093fd54009b0a6982bbbadf74eb7fc
4
+ data.tar.gz: e2a2a4200d1782839088ef0db9b0231c15839534
5
5
  SHA512:
6
- metadata.gz: bad5bf5d951038b96b9efe9fe15d23afb4104cb16a968db4861c5c91575acff6ac694f1f98f57f2f26bd46dab000bfd49f417d9f6cbf95ba04ece0ab28967009
7
- data.tar.gz: a1e6453360a058539cd96ce834c67625abe5cce2a424bf19004f3fb065b1ba4a1f67ed1c2f55e0690df6ab56ad14a1f37a8cbc0c357ab109282876c1ec342b9a
6
+ metadata.gz: b82aace89ab4cdee5af0a14efde94ce6304e3619d8ddf16df6a439c0e850bee7fd12ddf7b0c93b78fa2c62ffafae72ab4d433bd3915b9ea2c879bd46c21425b8
7
+ data.tar.gz: c6b01886a05159ad378711135c7601f37120ac871959023176f5f9bbe991d64f44ae1b8969bb04553cd9100be32b16e649e97cddc737d46abc21d2b73e37e994
data/History.md CHANGED
@@ -1,4 +1,10 @@
1
- === 2.0 / 2016-03-DD
1
+ === 2.1 / 2016-06-07
2
+
3
+ * Fix an issue discovered with connection when host keys are not set but
4
+ are overriding globally defined host keys or key data. Added
5
+ Cartage::Remote::Host tests to ensure that this does not regress.
6
+
7
+ === 2.0 / 2016-05-31
2
8
 
3
9
  * Rewrote for compatibility with cartage 2.0.
4
10
 
@@ -9,3 +9,4 @@ lib/cartage/plugins/remote.rb
9
9
  lib/cartage/remote/host.rb
10
10
  test/minitest_config.rb
11
11
  test/test_cartage_remote.rb
12
+ test/test_cartage_remote_host.rb
@@ -182,7 +182,7 @@ class Cartage
182
182
  # bundle exec cartage --config-file %{config_file} pack &&
183
183
  # bundle exec cartage --config-file %{config_file} s3 put
184
184
  class Remote < Cartage::Plugin
185
- VERSION = '2.0' #:nodoc:
185
+ VERSION = '2.1' #:nodoc:
186
186
 
187
187
  # Build on the remote server.
188
188
  def build
@@ -377,7 +377,7 @@ cd #{paths.build_path} && git checkout #{cartage.release_hashref}
377
377
  else
378
378
  @keys = Array(config.keys || '~/.ssh/*id_[rd]sa').flat_map { |key|
379
379
  Pathname.glob(Pathname(key).expand_path)
380
- }
380
+ }.uniq
381
381
  end
382
382
 
383
383
  @build_root = Pathname(config.build_root || '~')
@@ -17,6 +17,12 @@ class Cartage::Remote::Host
17
17
  # The (optional) postbuild script defined as part of this host.
18
18
  attr_reader :postbuild
19
19
 
20
+ # The (optional) array of SSH private key filenames defined as part of this
21
+ # host.
22
+ attr_reader :keys
23
+ # The (optional) array of SSH private keys defined as part of this host.
24
+ attr_reader :key_data
25
+
20
26
  # The Fog::SSH instance for this server. Must run #configure_ssh before
21
27
  # using.
22
28
  attr_reader :ssh
@@ -41,11 +47,17 @@ class Cartage::Remote::Host
41
47
 
42
48
  if host.keys.kind_of?(OpenStruct)
43
49
  @key_data = host.keys.to_h.values
44
- else
50
+ elsif host.keys
45
51
  @keys = Array(host.keys).flat_map { |key|
46
52
  Pathname.glob(Pathname(key).expand_path)
47
- }
53
+ }.uniq
48
54
  end
55
+
56
+ # If key_data or keys are empty, properly empty them so that they are
57
+ # handled improperly.
58
+ @key_data = nil if @key_data && @key_data.empty?
59
+ @keys = nil if @keys && @keys.empty?
60
+
49
61
  @build = host.build
50
62
  @prebuild = host.prebuild
51
63
  @postbuild = host.postbuild
@@ -9,3 +9,7 @@ require 'minitest/bisect'
9
9
  require 'minitest-bonus-assertions'
10
10
 
11
11
  require 'cartage/minitest'
12
+ require 'cartage/plugins/remote'
13
+ require 'fog'
14
+
15
+ Fog.mock!
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest_config'
4
+
5
+ describe 'Cartage::Remote::Host' do
6
+ let(:string_host) {
7
+ 'suser@saddress:sport'
8
+ }
9
+ let(:hash_host) {
10
+ {
11
+ user: 'huser',
12
+ address: 'haddress',
13
+ host: 'hhost',
14
+ port: 'hport'
15
+ }
16
+ }
17
+
18
+ let(:remote_config) {
19
+ {
20
+ hosts: {
21
+ default: hash_host
22
+ }
23
+ }
24
+ }
25
+ let(:config_hash) {
26
+ {
27
+ root_path: '/a/b/c',
28
+ name: 'test',
29
+ timestamp: 'value',
30
+ plugins: {
31
+ remote: remote_config
32
+ }
33
+ }
34
+ }
35
+ let(:config) { Cartage::Config.new(config_hash) }
36
+ let(:host) { Cartage::Remote::Host.new(config.plugins.remote.hosts.default) }
37
+ let(:ssh) { host.ssh }
38
+
39
+ describe '#initialize' do
40
+ it 'parses a string host correctly' do
41
+ host = Cartage::Remote::Host.new(string_host)
42
+ assert_equal 'suser', host.user
43
+ assert_equal 'saddress', host.address
44
+ assert_equal 'sport', host.port
45
+ assert_nil host.build
46
+ assert_nil host.prebuild
47
+ assert_nil host.postbuild
48
+ assert_nil host.keys
49
+ assert_nil host.key_data
50
+ end
51
+
52
+ describe 'with a config/OpenStruct host' do
53
+ it 'parses correctly' do
54
+ assert_equal 'huser', host.user
55
+ assert_equal 'haddress', host.address
56
+ assert_equal 'hport', host.port
57
+ assert_nil host.build
58
+ assert_nil host.prebuild
59
+ assert_nil host.postbuild
60
+ assert_nil host.keys
61
+ assert_nil host.key_data
62
+ end
63
+
64
+ it 'parses host script overrides correctly' do
65
+ hash_host.update(
66
+ build: 'hbuild',
67
+ prebuild: 'hprebuild',
68
+ postbuild: 'hpostbuild'
69
+ )
70
+
71
+ assert_equal 'hbuild', host.build
72
+ assert_equal 'hprebuild', host.prebuild
73
+ assert_equal 'hpostbuild', host.postbuild
74
+ end
75
+
76
+ it 'parses host keys overrides correctly' do
77
+ hash_host.update(keys: '~/.ssh/id_rsa')
78
+
79
+ stub Pathname, :glob, %w(/home/user/.ssh/id_rsa) do
80
+ assert_equal %w(/home/user/.ssh/id_rsa), host.keys
81
+ assert_nil host.key_data
82
+ end
83
+ end
84
+
85
+ it 'parses host keys overrides correctly (removing duplicates)' do
86
+ hash_host.update(keys: %w(~/.ssh/id_rsa) * 2)
87
+
88
+ stub Pathname, :glob, %w(/home/user/.ssh/id_rsa) do
89
+ assert_equal %w(/home/user/.ssh/id_rsa), host.keys
90
+ assert_nil host.key_data
91
+ end
92
+ end
93
+
94
+ it 'parses empty host keys overrides correctly (back to nil)' do
95
+ hash_host.update(keys: [])
96
+
97
+ stub Pathname, :glob, %w(/home/user/.ssh/id_rsa) do
98
+ assert_nil host.keys
99
+ assert_nil host.key_data
100
+ end
101
+ end
102
+
103
+ it 'parses host key_data overrides correctly' do
104
+ hash_host.update(
105
+ keys: {
106
+ custom: 'Host ASCII-Armored Private Key'
107
+ }
108
+ )
109
+
110
+ assert_nil host.keys
111
+ assert_equal [ 'Host ASCII-Armored Private Key' ], host.key_data
112
+ end
113
+
114
+ it 'parses empty host key_data overrides correctly (back to nil)' do
115
+ hash_host.update(keys: {})
116
+
117
+ assert_nil host.keys
118
+ assert_nil host.key_data
119
+ end
120
+ end
121
+ end
122
+
123
+ describe '#configure_ssh' do
124
+ def assert_ssh_value(expected, name)
125
+ assert_equal expected, ssh.instance_variable_get(:"@#{name}")
126
+ end
127
+
128
+ def assert_ssh_option(expected, name)
129
+ assert_equal expected, ssh.instance_variable_get(:@options)[name]
130
+ end
131
+
132
+ it 'configures SSH properly' do
133
+ host.configure_ssh({})
134
+ assert_ssh_value 'haddress', :address
135
+ assert_ssh_value 'huser', :username
136
+ assert_ssh_option 'hport', :port
137
+ assert_ssh_option true, :paranoid
138
+ end
139
+
140
+ it 'uses the provided key_data if there is no host override' do
141
+ host.configure_ssh(key_data: [ 'Global ASCII-Armored Private Key' ])
142
+ assert_ssh_option [ 'Global ASCII-Armored Private Key' ], :key_data
143
+ end
144
+
145
+ it 'uses the provided keys if there is no host override' do
146
+ host.configure_ssh(keys: %w(path/to/a/key/file))
147
+ assert_ssh_option %w(path/to/a/key/file), :keys
148
+ end
149
+
150
+ it 'uses the host keys if present' do
151
+ hash_host.update(keys: '~/.ssh/id_rsa')
152
+
153
+ stub Pathname, :glob, %w(/home/user/.ssh/id_rsa) do
154
+ host.configure_ssh(keys: [ 'path/to/a/key/file' ])
155
+ end
156
+
157
+ assert_ssh_option %w(/home/user/.ssh/id_rsa), :keys
158
+ end
159
+
160
+ it 'uses the provided keys if host keys is empty' do
161
+ hash_host.update(keys: [])
162
+ host.configure_ssh(keys: %w(path/to/a/key/file))
163
+ assert_ssh_option %w(path/to/a/key/file), :keys
164
+ end
165
+
166
+ it 'uses the provided key_data if host key_data is empty' do
167
+ hash_host.update(keys: {})
168
+ host.configure_ssh(key_data: [ 'Global ASCII-Armored Private Key' ])
169
+ assert_ssh_option [ 'Global ASCII-Armored Private Key' ], :key_data
170
+ end
171
+ end
172
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cartage-remote
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.0'
4
+ version: '2.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Austin Ziegler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-31 00:00:00.000000000 Z
11
+ date: 2016-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cartage
@@ -319,6 +319,7 @@ files:
319
319
  - lib/cartage/remote/host.rb
320
320
  - test/minitest_config.rb
321
321
  - test/test_cartage_remote.rb
322
+ - test/test_cartage_remote_host.rb
322
323
  homepage: https://github.com/KineticCafe/cartage-remote/
323
324
  licenses:
324
325
  - MIT