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 +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/CHANGELOG.md +16 -0
- data/README.md +2 -0
- data/kitchen-transport-express.gemspec +4 -0
- data/lib/kitchen/transport/express/archiver.rb +12 -5
- data/lib/kitchen/transport/express/version.rb +1 -1
- data/lib/kitchen/transport/express_ssh.rb +34 -14
- metadata +46 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a21e10d9f04926c86f5594321e1beef3d71c314ed61649ff1476cf4d632a4ee
|
4
|
+
data.tar.gz: 2c0d14e4ae4cc96111e2fea95fde8affc3f89686867910c459007bb06c110bd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9aa3d0be0cb45cf030333df24ca40431e1c387c7a3d0a086dacb03c5fa2c64f7e15bd02f98e1a5b70374950d986be90dd6757b0faeb460baa614992cca477af
|
7
|
+
data.tar.gz: 95e16299ded0673a3c7fd85db9e04defe7c0d04db6c51459024cd75badd8b3a1672485f8d7f0e40af7e21c6aaa9964e153676a390173d6e7e3a068939905df4d
|
data/.github/workflows/ruby.yml
CHANGED
@@ -9,7 +9,7 @@ name: Ruby
|
|
9
9
|
|
10
10
|
on:
|
11
11
|
pull_request:
|
12
|
-
branches: [ "
|
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.
|
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
|
+
[](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(
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
88
|
+
File.read(file, mode: "rb") unless File.directory? file
|
82
89
|
end
|
83
90
|
|
84
91
|
def size(file)
|
@@ -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
|
48
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
80
|
-
|
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
|
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-
|
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: '
|
158
|
+
version: '2.4'
|
116
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
160
|
requirements:
|
118
161
|
- - ">="
|