vmfloaty 1.6.0 → 1.7.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/README.md +18 -0
- data/lib/vmfloaty/service.rb +2 -2
- data/lib/vmfloaty/ssh.rb +27 -9
- data/lib/vmfloaty/utils.rb +22 -7
- data/lib/vmfloaty/version.rb +1 -1
- data/lib/vmfloaty.rb +1 -1
- data/spec/vmfloaty/ssh_spec.rb +85 -22
- data/spec/vmfloaty/utils_spec.rb +19 -3
- metadata +3 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 259a0672eabcb43fbb7fddd8205341050ab60f902e7842cb520f81bab1f139eb
|
4
|
+
data.tar.gz: 22fdda03271053a921f305c6e547d09308d1d734bc77dfbd60bbbf47483e4137
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c0ca6bc4d734b7b0712001d7bd33b8b493cdf2e588712d422383631ef9a749f8b98964ff6a8b05dd2c4c465fb0726af3af88692bc4baa94278c546461614bc4
|
7
|
+
data.tar.gz: 072a4ab26891877393d3b70bc71d409b0a7dccd930bc6271fe6cf6bd7e16fe10e5fcd250b8313112afb9e8e9f25043c41d5173ad6bc0fb121d7e1f8255e74d4d
|
data/README.md
CHANGED
@@ -19,6 +19,9 @@ A CLI helper tool for [Puppet's VMPooler](https://github.com/puppetlabs/vmpooler
|
|
19
19
|
- [VMPooler API](#vmpooler-api)
|
20
20
|
- [Using the Pooler class](#using-the-pooler-class)
|
21
21
|
- [Example Projects](#example-projects)
|
22
|
+
- [Contributing](#contributing)
|
23
|
+
- [Code Reviews](#code-reviews)
|
24
|
+
- [Releasing](#releasing)
|
22
25
|
- [Special thanks](#special-thanks)
|
23
26
|
|
24
27
|
## Install
|
@@ -164,6 +167,21 @@ vmfloaty providers a `Pooler` class that gives users the ability to make request
|
|
164
167
|
- [Brian Cain: vagrant-vmpooler](https://github.com/briancain/vagrant-vmpooler)
|
165
168
|
- Use Vagrant to manage your vmpooler instances
|
166
169
|
|
170
|
+
## Contributing
|
171
|
+
|
172
|
+
PR's are welcome! We always love to see how others think this tool can be made better.
|
173
|
+
|
174
|
+
### Code Reviews
|
175
|
+
|
176
|
+
Please wait for multiple code owners to sign off on any notable change.
|
177
|
+
|
178
|
+
## Releasing
|
179
|
+
|
180
|
+
Releasing is a two step process:
|
181
|
+
|
182
|
+
1. Submit a release prep PR that updates `lib/vmfloaty/version.rb` to the desired new version and get that merged
|
183
|
+
2. Navigate to <https://github.com/puppetlabs/vmfloaty/actions/workflows/release.yml> --> Run workflow --> select "main" branch --> Run workflow. This will publish a GitHub release, build, and push the gem to RubyGems.
|
184
|
+
|
167
185
|
## Special thanks
|
168
186
|
|
169
187
|
Special thanks to [Brian Cain](https://github.com/briancain) as he is the original author of vmfloaty! Vast amounts of this code exist thanks to his efforts.
|
data/lib/vmfloaty/service.rb
CHANGED
@@ -87,7 +87,7 @@ class Service
|
|
87
87
|
@service_object.wait_for_request verbose, requestid, url
|
88
88
|
end
|
89
89
|
|
90
|
-
def ssh(verbose, host_os, use_token = true)
|
90
|
+
def ssh(verbose, host_os, use_token = true, ondemand = nil)
|
91
91
|
token_value = nil
|
92
92
|
if use_token
|
93
93
|
begin
|
@@ -97,7 +97,7 @@ class Service
|
|
97
97
|
FloatyLogger.info 'Could not get token... requesting vm without a token anyway...'
|
98
98
|
end
|
99
99
|
end
|
100
|
-
Ssh.ssh(verbose, self, host_os, token_value)
|
100
|
+
Ssh.ssh(verbose, self, host_os, token_value, ondemand)
|
101
101
|
end
|
102
102
|
|
103
103
|
def query(verbose, hostname)
|
data/lib/vmfloaty/ssh.rb
CHANGED
@@ -14,27 +14,45 @@ class Ssh
|
|
14
14
|
nil
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.command_string(verbose, service, host_os, use_token)
|
17
|
+
def self.command_string(verbose, service, host_os, use_token, ondemand = nil)
|
18
18
|
ssh_path = which('ssh')
|
19
19
|
raise 'Could not determine path to ssh' unless ssh_path
|
20
|
-
|
21
|
-
os_types = {}
|
20
|
+
os_types = Utils.generate_os_hash([host_os])
|
22
21
|
os_types[host_os] = 1
|
23
22
|
|
24
|
-
response = service.retrieve(verbose, os_types, use_token)
|
23
|
+
response = service.retrieve(verbose, os_types, use_token, ondemand)
|
25
24
|
raise "Could not get vm from #{service.type}:\n #{response}" unless response['ok']
|
26
25
|
|
27
26
|
user = /win/.match?(host_os) ? 'Administrator' : 'root'
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
if ondemand
|
29
|
+
requestid = response['request_id']
|
30
|
+
service.wait_for_request(verbose, requestid)
|
31
|
+
hosts = service.check_ondemandvm(verbose, requestid, service.url)
|
32
|
+
if hosts['domain'].nil?
|
33
|
+
hostname = hosts[host_os]['hostname']
|
34
|
+
hostname = hosts[host_os]['hostname'][0] if hosts[host_os]['hostname'].is_a?(Array)
|
35
|
+
else
|
36
|
+
# Provides backwards compatibility with VMPooler API v1
|
37
|
+
hostname = "#{hosts[host_os]['hostname']}.#{hosts['domain']}"
|
38
|
+
hostname = "#{hosts[host_os]['hostname'][0]}.#{hosts['domain']}" if hosts[host_os]['hostname'].is_a?(Array)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
if response['domain'].nil?
|
42
|
+
hostname = response[host_os]['hostname']
|
43
|
+
hostname = response[host_os]['hostname'][0] if response[host_os]['hostname'].is_a?(Array)
|
44
|
+
else
|
45
|
+
# Provides backwards compatibility with VMPooler API v1
|
46
|
+
hostname = "#{response[host_os]['hostname']}.#{response['domain']}"
|
47
|
+
hostname = "#{response[host_os]['hostname'][0]}.#{response['domain']}" if response[host_os]['hostname'].is_a?(Array)
|
48
|
+
end
|
49
|
+
end
|
32
50
|
|
33
51
|
"#{ssh_path} #{user}@#{hostname}"
|
34
52
|
end
|
35
53
|
|
36
|
-
def self.ssh(verbose, service, host_os, use_token)
|
37
|
-
cmd = command_string(verbose, service, host_os, use_token)
|
54
|
+
def self.ssh(verbose, service, host_os, use_token, ondemand)
|
55
|
+
cmd = command_string(verbose, service, host_os, use_token, ondemand)
|
38
56
|
# TODO: Should this respect more ssh settings? Can it be configured
|
39
57
|
# by users ssh config and does this respect those settings?
|
40
58
|
Kernel.exec(cmd)
|
data/lib/vmfloaty/utils.rb
CHANGED
@@ -9,7 +9,7 @@ class Utils
|
|
9
9
|
# TODO: Takes the json response body from an HTTP GET
|
10
10
|
# request and "pretty prints" it
|
11
11
|
def self.standardize_hostnames(response_body)
|
12
|
-
# vmpooler response body example when `floaty get` arguments are `ubuntu-1610-x86_64=2 centos-7-x86_64`:
|
12
|
+
# vmpooler api v1 response body example when `floaty get` arguments are `ubuntu-1610-x86_64=2 centos-7-x86_64`:
|
13
13
|
# {
|
14
14
|
# "ok": true,
|
15
15
|
# "domain": "delivery.mycompany.net",
|
@@ -21,6 +21,17 @@ class Utils
|
|
21
21
|
# }
|
22
22
|
# }
|
23
23
|
|
24
|
+
# vmpooler api v2 response body example when `floaty get` arguments are `ubuntu-1610-x86_64=2 centos-7-x86_64`:
|
25
|
+
# {
|
26
|
+
# "ok": true,
|
27
|
+
# "ubuntu-1610-x86_64": {
|
28
|
+
# "hostname": ["gdoy8q3nckuob0i.pooler.example.com", "ctnktsd0u11p9tm.pooler.example.com"]
|
29
|
+
# },
|
30
|
+
# "centos-7-x86_64": {
|
31
|
+
# "hostname": "dlgietfmgeegry2.pooler.example.com"
|
32
|
+
# }
|
33
|
+
# }
|
34
|
+
|
24
35
|
# nonstandard pooler response body example when `floaty get` arguments are `solaris-11-sparc=2 ubuntu-16.04-power8`:
|
25
36
|
# {
|
26
37
|
# "ok": true,
|
@@ -98,7 +109,11 @@ class Utils
|
|
98
109
|
|
99
110
|
puts abs_hostnames.join("\n")
|
100
111
|
when 'Pooler'
|
101
|
-
|
112
|
+
if host_data['domain'].nil?
|
113
|
+
puts hostname
|
114
|
+
else
|
115
|
+
puts "#{hostname}.#{host_data['domain']}"
|
116
|
+
end
|
102
117
|
when 'NonstandardPooler'
|
103
118
|
puts host_data['fqdn']
|
104
119
|
else
|
@@ -197,9 +212,9 @@ class Utils
|
|
197
212
|
pending = pool['pending']
|
198
213
|
missing = max - ready - pending
|
199
214
|
char = 'o'
|
200
|
-
puts "#{name.ljust(width)} #{(char * ready)
|
215
|
+
puts "#{name.ljust(width)} #{(char * ready)}#{(char * pending)}#{(char * missing)}"
|
201
216
|
rescue StandardError => e
|
202
|
-
FloatyLogger.error "#{name.ljust(width)} #{e
|
217
|
+
FloatyLogger.error "#{name.ljust(width)} #{e}"
|
203
218
|
end
|
204
219
|
puts message
|
205
220
|
when 'NonstandardPooler'
|
@@ -214,13 +229,13 @@ class Utils
|
|
214
229
|
pending = pool['pending'] || 0 # not available for nspooler
|
215
230
|
missing = max - ready - pending
|
216
231
|
char = 'o'
|
217
|
-
puts "#{name.ljust(width)} #{(char * ready)
|
232
|
+
puts "#{name.ljust(width)} #{(char * ready)}#{(char * pending)}#{(char * missing)}"
|
218
233
|
rescue StandardError => e
|
219
|
-
FloatyLogger.error "#{name.ljust(width)} #{e
|
234
|
+
FloatyLogger.error "#{name.ljust(width)} #{e}"
|
220
235
|
end
|
221
236
|
when 'ABS'
|
222
237
|
FloatyLogger.error 'ABS Not OK' unless status_response
|
223
|
-
puts 'ABS is OK'
|
238
|
+
puts 'ABS is OK' if status_response
|
224
239
|
else
|
225
240
|
raise "Invalid service type #{service.type}"
|
226
241
|
end
|
data/lib/vmfloaty/version.rb
CHANGED
data/lib/vmfloaty.rb
CHANGED
@@ -484,7 +484,7 @@ class Vmfloaty
|
|
484
484
|
|
485
485
|
FloatyLogger.info "Can't ssh to multiple hosts; Using #{host_os} only..." if args.length > 1
|
486
486
|
|
487
|
-
service.ssh(verbose, host_os, use_token)
|
487
|
+
service.ssh(verbose, host_os, use_token, options.ondemand)
|
488
488
|
exit 0
|
489
489
|
end
|
490
490
|
end
|
data/spec/vmfloaty/ssh_spec.rb
CHANGED
@@ -4,24 +4,35 @@ require 'spec_helper'
|
|
4
4
|
require 'vmfloaty/ssh'
|
5
5
|
|
6
6
|
class ServiceStub
|
7
|
-
def retrieve(_verbose, os_types, _use_token)
|
7
|
+
def retrieve(_verbose, os_types, _use_token, ondemand)
|
8
8
|
if os_types.keys[0] == 'abs_host_string'
|
9
9
|
return {
|
10
10
|
os_types.keys[0] => { 'hostname' => ['abs-hostname.delivery.puppetlabs.net'] },
|
11
11
|
'ok' => true
|
12
12
|
}
|
13
|
-
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
elsif os_types.keys[0] == 'vmpooler_api_v2_host_string'
|
15
|
+
return {
|
16
|
+
os_types.keys[0] => { 'hostname' => ['vmpooler-v2-hostname.delivery.puppetlabs.net'] },
|
17
|
+
'ok' => true
|
18
|
+
}
|
19
|
+
|
20
|
+
else
|
21
|
+
return {
|
22
|
+
os_types.keys[0] => { 'hostname' => 'vmpooler-v1-hostname' },
|
23
|
+
'domain' => 'delivery.puppetlabs.net',
|
24
|
+
'ok' => true
|
25
|
+
}
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
def type
|
23
30
|
return 'abs' if os_types == 'abs_host_string'
|
24
|
-
return 'vmpooler' if os_types == '
|
31
|
+
return 'vmpooler' if os_types == 'vmpooler_api_v1_host_string' || os_types == 'vmpooler_api_v2_host_string'
|
32
|
+
end
|
33
|
+
|
34
|
+
def wait_for_request(verbose, requestid)
|
35
|
+
return true
|
25
36
|
end
|
26
37
|
end
|
27
38
|
|
@@ -29,21 +40,73 @@ describe Ssh do
|
|
29
40
|
before :each do
|
30
41
|
end
|
31
42
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
43
|
+
context "for pooled requests" do
|
44
|
+
it 'gets a hostname string for abs' do
|
45
|
+
verbose = false
|
46
|
+
service = ServiceStub.new
|
47
|
+
host_os = 'abs_host_string'
|
48
|
+
use_token = false
|
49
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token)
|
50
|
+
expect(cmd).to match(/ssh root@abs-hostname.delivery.puppetlabs.net/)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'gets a hostname string for vmpooler api v1' do
|
54
|
+
verbose = true
|
55
|
+
service = ServiceStub.new
|
56
|
+
host_os = 'vmpooler_api_v1_host_string'
|
57
|
+
use_token = false
|
58
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token)
|
59
|
+
expect(cmd).to match(/ssh root@vmpooler-v1-hostname.delivery.puppetlabs.net/)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'gets a hostname string for vmpooler api v2' do
|
63
|
+
verbose = false
|
64
|
+
service = ServiceStub.new
|
65
|
+
host_os = 'vmpooler_api_v2_host_string'
|
66
|
+
use_token = false
|
67
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token)
|
68
|
+
expect(cmd).to match(/ssh root@vmpooler-v2-hostname.delivery.puppetlabs.net/)
|
69
|
+
end
|
39
70
|
end
|
40
71
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
72
|
+
context "for ondemand requests" do
|
73
|
+
let(:service) { ServiceStub.new }
|
74
|
+
let(:url) { 'http://pooler.example.com' }
|
75
|
+
|
76
|
+
it 'gets a hostname string for abs' do
|
77
|
+
verbose = false
|
78
|
+
host_os = 'abs_host_string'
|
79
|
+
use_token = false
|
80
|
+
ondemand = true
|
81
|
+
response = {'abs_host_string' => { 'hostname' => ['abs-hostname.delivery.puppetlabs.net']}}
|
82
|
+
allow(service).to receive(:url)
|
83
|
+
allow(service).to receive(:check_ondemandvm).and_return(response)
|
84
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token, ondemand)
|
85
|
+
expect(cmd).to match(/ssh root@abs-hostname.delivery.puppetlabs.net/)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'gets a hostname string for abs' do
|
89
|
+
verbose = false
|
90
|
+
host_os = 'vmpooler_api_v1_host_string'
|
91
|
+
use_token = false
|
92
|
+
ondemand = true
|
93
|
+
response = {'vmpooler_api_v1_host_string' => { 'hostname' => ['vmpooler_api_v1_host_string.delivery.puppetlabs.net']}}
|
94
|
+
allow(service).to receive(:url)
|
95
|
+
allow(service).to receive(:check_ondemandvm).and_return(response)
|
96
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token, ondemand)
|
97
|
+
expect(cmd).to match(/ssh root@vmpooler_api_v1_host_string.delivery.puppetlabs.net/)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'gets a hostname string for abs' do
|
101
|
+
verbose = false
|
102
|
+
host_os = 'vmpooler_api_v2_host_string'
|
103
|
+
use_token = false
|
104
|
+
ondemand = true
|
105
|
+
response = {'vmpooler_api_v2_host_string' => { 'hostname' => ['vmpooler_api_v2_host_string.delivery.puppetlabs.net']}}
|
106
|
+
allow(service).to receive(:url)
|
107
|
+
allow(service).to receive(:check_ondemandvm).and_return(response)
|
108
|
+
cmd = Ssh.command_string(verbose, service, host_os, use_token, ondemand)
|
109
|
+
expect(cmd).to match(/ssh root@vmpooler_api_v2_host_string.delivery.puppetlabs.net/)
|
110
|
+
end
|
48
111
|
end
|
49
112
|
end
|
data/spec/vmfloaty/utils_spec.rb
CHANGED
@@ -13,7 +13,7 @@ end
|
|
13
13
|
describe Utils do
|
14
14
|
describe '#standardize_hostnames' do
|
15
15
|
before :each do
|
16
|
-
@
|
16
|
+
@vmpooler_api_v1_response_body = '{
|
17
17
|
"ok": true,
|
18
18
|
"domain": "delivery.mycompany.net",
|
19
19
|
"ubuntu-1610-x86_64": {
|
@@ -23,6 +23,15 @@ describe Utils do
|
|
23
23
|
"hostname": "dlgietfmgeegry2"
|
24
24
|
}
|
25
25
|
}'
|
26
|
+
@vmpooler_api_v2_response_body = '{
|
27
|
+
"ok": true,
|
28
|
+
"ubuntu-1610-x86_64": {
|
29
|
+
"hostname": ["gdoy8q3nckuob0i.delivery.mycompany.net", "ctnktsd0u11p9tm.delivery.mycompany.net"]
|
30
|
+
},
|
31
|
+
"centos-7-x86_64": {
|
32
|
+
"hostname": "dlgietfmgeegry2.delivery.mycompany.net"
|
33
|
+
}
|
34
|
+
}'
|
26
35
|
@nonstandard_response_body = '{
|
27
36
|
"ok": true,
|
28
37
|
"solaris-10-sparc": {
|
@@ -34,8 +43,15 @@ describe Utils do
|
|
34
43
|
}'
|
35
44
|
end
|
36
45
|
|
37
|
-
it 'formats a result from vmpooler into a hash of os to hostnames' do
|
38
|
-
result = Utils.standardize_hostnames(JSON.parse(@
|
46
|
+
it 'formats a result from vmpooler v1 api into a hash of os to hostnames' do
|
47
|
+
result = Utils.standardize_hostnames(JSON.parse(@vmpooler_api_v1_response_body))
|
48
|
+
expect(result).to eq('centos-7-x86_64' => ['dlgietfmgeegry2.delivery.mycompany.net'],
|
49
|
+
'ubuntu-1610-x86_64' => ['gdoy8q3nckuob0i.delivery.mycompany.net',
|
50
|
+
'ctnktsd0u11p9tm.delivery.mycompany.net'])
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'formats a result from vmpooler v2 api into a hash of os to hostnames' do
|
54
|
+
result = Utils.standardize_hostnames(JSON.parse(@vmpooler_api_v2_response_body))
|
39
55
|
expect(result).to eq('centos-7-x86_64' => ['dlgietfmgeegry2.delivery.mycompany.net'],
|
40
56
|
'ubuntu-1610-x86_64' => ['gdoy8q3nckuob0i.delivery.mycompany.net',
|
41
57
|
'ctnktsd0u11p9tm.delivery.mycompany.net'])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmfloaty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Cain
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-04-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: commander
|
@@ -52,9 +52,7 @@ dependencies:
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: 1.5.1
|
54
54
|
description: A helper tool for vmpooler to help you stay afloat
|
55
|
-
email:
|
56
|
-
- brianccain@gmail.com
|
57
|
-
- dio-gems@puppet.com
|
55
|
+
email: dio-gems@puppet.com
|
58
56
|
executables:
|
59
57
|
- floaty
|
60
58
|
extensions: []
|