kitchen-transport-express 1.0.1 → 1.1.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
  SHA256:
3
- metadata.gz: 9b89707a72ba0d8afb26ec6cea9b18ea49cb22aee40c0291a1ceb01a1d2ea4fd
4
- data.tar.gz: 14d5a4f4d22221053960bd9351c96bbc9d95231af2bb0590c517b559746f120f
3
+ metadata.gz: 0a21e10d9f04926c86f5594321e1beef3d71c314ed61649ff1476cf4d632a4ee
4
+ data.tar.gz: 2c0d14e4ae4cc96111e2fea95fde8affc3f89686867910c459007bb06c110bd2
5
5
  SHA512:
6
- metadata.gz: ef0f2ba583d76b6c4bf2997f4e039374b7b79801eba8b5b678104d7a6e40db08a4433bc97c3b1845ee0b33b9bdab59232cdf593dc1c3e5767ee5be1016782858
7
- data.tar.gz: 75b55d9dc967c84e981eb3b1bf1a6c92a88b304812909f32bf66a70d75aa6e28f528b22e839efc15a412dd355a71eb84860dabb89225f6e5a87dc6c4645ce040
6
+ metadata.gz: f9aa3d0be0cb45cf030333df24ca40431e1c387c7a3d0a086dacb03c5fa2c64f7e15bd02f98e1a5b70374950d986be90dd6757b0faeb460baa614992cca477af
7
+ data.tar.gz: 95e16299ded0673a3c7fd85db9e04defe7c0d04db6c51459024cd75badd8b3a1672485f8d7f0e40af7e21c6aaa9964e153676a390173d6e7e3a068939905df4d
@@ -9,7 +9,7 @@ name: Ruby
9
9
 
10
10
  on:
11
11
  pull_request:
12
- branches: [ "master" ]
12
+ branches: [ "main" ]
13
13
 
14
14
  permissions:
15
15
  contents: read
@@ -20,7 +20,7 @@ jobs:
20
20
  runs-on: ubuntu-latest
21
21
  strategy:
22
22
  matrix:
23
- ruby-version: ['2.3', '2.5', '2.7', '3.0', '3.1']
23
+ ruby-version: ['2.5', '2.7', '3.0', '3.1']
24
24
 
25
25
  steps:
26
26
  - uses: actions/checkout@v4
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # kitchen-transport-express CHANGELOG
2
+
3
+ ## 1.1.0
4
+ * feat: ⚡️ threaded execution of the upload and extract phase
5
+ * fix: 🩹 add binary mode to archiver when reading a file
6
+ * chore: ➕ add chefstyle and pry to development deps
7
+ * chore: 📌 set minimum ruby version
8
+
9
+ ## 1.0.2
10
+ * fix: 🐛 ensure finalize_config gets called
11
+
12
+ ## 1.0.1
13
+ * chore: 📝 add github_url to gemspec
14
+
15
+ ## 1.0.0
16
+ * feat: 🎉 initial release
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Kitchen::Transport::Express
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/kitchen-transport-express.svg)](https://badge.fury.io/rb/kitchen-transport-express)
4
+
3
5
  `kitchen-transport-express` is a plugin for `Kitchen::Transport` that is designed to dramatically improve the time to converge nodes over SSH. This gem was inspired by projects
4
6
  like [kitchen-transport-speedy](https://github.com/criteo/kitchen-transport-speedy) and [kitchen-sync](https://github.com/coderanger/kitchen-sync).
5
7
 
@@ -30,9 +30,13 @@ Gem::Specification.new do |spec|
30
30
  spec.metadata["github_repo"] = "https://github.com/justintsteele/kitchen-transport-express"
31
31
  spec.license = "Apache-2.0"
32
32
  spec.require_paths = ["lib"]
33
+ spec.required_ruby_version = ">= 2.4"
33
34
  spec.add_dependency "test-kitchen"
34
35
  spec.add_dependency "ffi-libarchive"
36
+ spec.add_dependency "concurrent-ruby"
35
37
  spec.add_development_dependency "bundler"
38
+ spec.add_development_dependency "chefstyle"
39
+ spec.add_development_dependency "pry"
36
40
  spec.add_development_dependency "rake"
37
41
  spec.add_development_dependency "rspec"
38
42
  end
@@ -30,10 +30,17 @@ module Kitchen
30
30
  archive_full_name
31
31
  end
32
32
 
33
- def extract(archive_basename, remote)
34
- logger.debug("[#{LOG_PREFIX}] Unpacking archive #{archive_basename} in #{remote}")
35
- execute("tar -xzf #{::File.join(remote, archive_basename)} -C #{remote}")
36
- execute("rm -f #{::File.join(remote, archive_basename)}")
33
+ def extract(session, local, remote)
34
+ return unless local.match(/.*\.tgz/)
35
+
36
+ archive_basename = File.basename(local)
37
+ logger.debug("[#{LOG_PREFIX}] Extracting #{::File.join(remote, archive_basename)}")
38
+ session.open_channel do |channel|
39
+ channel.request_pty
40
+ channel.exec("tar -xzf #{::File.join(remote, archive_basename)} -C #{remote}")
41
+ channel.exec("rm -f #{File.join(remote, archive_basename)}")
42
+ end
43
+ session.loop
37
44
  end
38
45
 
39
46
  private
@@ -78,7 +85,7 @@ module Kitchen
78
85
  end
79
86
 
80
87
  def content(file)
81
- File.read file unless File.directory? file
88
+ File.read(file, mode: "rb") unless File.directory? file
82
89
  end
83
90
 
84
91
  def size(file)
@@ -17,7 +17,7 @@
17
17
  module Kitchen
18
18
  module Transport
19
19
  class Express
20
- VERSION = "1.0.1"
20
+ VERSION = "1.1.0"
21
21
  end
22
22
  end
23
23
  end
@@ -15,6 +15,7 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "kitchen/transport/ssh"
18
+ require "concurrent-ruby"
18
19
  require_relative "express/version"
19
20
  require_relative "express/archiver"
20
21
 
@@ -41,11 +42,11 @@ module Kitchen
41
42
  end
42
43
 
43
44
  def finalize_config!(instance)
44
- return unless verifier_defined?(instance)
45
-
46
45
  super.tap do
47
- instance.verifier.send(:define_singleton_method, :runner_options_for_expressssh) do |config_data|
48
- runner_options_for_ssh(config_data)
46
+ if verifier_defined?(instance)
47
+ instance.verifier.send(:define_singleton_method, :runner_options_for_expressssh) do |config_data|
48
+ runner_options_for_ssh(config_data)
49
+ end
49
50
  end
50
51
  end
51
52
  end
@@ -56,15 +57,14 @@ module Kitchen
56
57
  def upload(locals, remote)
57
58
  return super unless valid_remote_requirements?
58
59
 
59
- Array(locals).each do |local|
60
- if ::File.directory?(local)
61
- archive = archive(local)
62
- ensure_remote_dir_exists(remote)
63
- end
64
- logger.debug("[#{LOG_PREFIX}] Uploading #{File.basename(archive || local)} to #{remote}")
65
- super(archive || local, remote)
66
- extract(File.basename(archive), remote) if archive
60
+ execute("mkdir -p #{remote}")
61
+ processed_locals = process_locals(locals)
62
+ pool = Concurrent::FixedThreadPool.new([processed_locals.length, 10].min)
63
+ processed_locals.each do |local|
64
+ pool.post { transfer(local, remote, session.options) }
67
65
  end
66
+ pool.shutdown
67
+ pool.wait_for_termination
68
68
  end
69
69
 
70
70
  def valid_remote_requirements?
@@ -76,8 +76,28 @@ module Kitchen
76
76
  false
77
77
  end
78
78
 
79
- def ensure_remote_dir_exists(remote)
80
- execute("mkdir -p #{remote}")
79
+ private
80
+
81
+ def process_locals(locals)
82
+ processed_locals = []
83
+ Array(locals).each do |local|
84
+ if ::File.directory?(local)
85
+ archive_name = archive(local)
86
+ processed_locals.push archive_name
87
+ else
88
+ processed_locals.push local
89
+ end
90
+ end
91
+ processed_locals
92
+ end
93
+
94
+ def transfer(local, remote, opts = {})
95
+ logger.debug("[#{LOG_PREFIX}] Transferring #{local} to #{remote}")
96
+
97
+ Net::SSH.start(session.host, opts[:user], **opts) do |ssh|
98
+ ssh.scp.upload!(local, remote, opts)
99
+ extract(ssh, local, remote)
100
+ end
81
101
  end
82
102
  end
83
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-transport-express
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Steele
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-27 00:00:00.000000000 Z
11
+ date: 2025-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,34 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: chefstyle
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rake
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +133,7 @@ files:
91
133
  - ".github/workflows/ruby.yml"
92
134
  - ".gitignore"
93
135
  - ".rubocop.yml"
136
+ - CHANGELOG.md
94
137
  - Gemfile
95
138
  - LICENSE
96
139
  - README.md
@@ -112,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
155
  requirements:
113
156
  - - ">="
114
157
  - !ruby/object:Gem::Version
115
- version: '0'
158
+ version: '2.4'
116
159
  required_rubygems_version: !ruby/object:Gem::Requirement
117
160
  requirements:
118
161
  - - ">="