vmfloaty 0.10.0 → 1.2.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 +19 -75
- data/extras/completions/floaty.bash +17 -9
- data/extras/completions/floaty.zsh +43 -0
- data/lib/vmfloaty.rb +167 -42
- data/lib/vmfloaty/abs.rb +178 -73
- data/lib/vmfloaty/conf.rb +1 -1
- data/lib/vmfloaty/logger.rb +40 -0
- data/lib/vmfloaty/nonstandard_pooler.rb +1 -1
- data/lib/vmfloaty/pooler.rb +3 -3
- data/lib/vmfloaty/service.rb +27 -16
- data/lib/vmfloaty/utils.rb +126 -33
- data/lib/vmfloaty/version.rb +2 -1
- data/spec/vmfloaty/abs_spec.rb +55 -8
- data/spec/vmfloaty/utils_spec.rb +451 -73
- metadata +13 -11
@@ -22,7 +22,7 @@ class NonstandardPooler
|
|
22
22
|
status['reserved_hosts'] || []
|
23
23
|
end
|
24
24
|
|
25
|
-
def self.retrieve(verbose, os_type, token, url, _user, _options)
|
25
|
+
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil, _continue = nil)
|
26
26
|
conn = Http.get_conn(verbose, url)
|
27
27
|
conn.headers['X-AUTH-TOKEN'] = token if token
|
28
28
|
|
data/lib/vmfloaty/pooler.rb
CHANGED
@@ -28,7 +28,7 @@ class Pooler
|
|
28
28
|
vms
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil)
|
31
|
+
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil, _continue = nil)
|
32
32
|
# NOTE:
|
33
33
|
# Developers can use `Utils.generate_os_hash` to
|
34
34
|
# generate the os_type param.
|
@@ -60,10 +60,10 @@ class Pooler
|
|
60
60
|
while check_ondemandvm(verbose, request_id, url) == false
|
61
61
|
return false if (Time.now - start_time).to_i > timeout
|
62
62
|
|
63
|
-
|
63
|
+
FloatyLogger.info "waiting for request #{request_id} to be fulfilled"
|
64
64
|
sleep 5
|
65
65
|
end
|
66
|
-
|
66
|
+
FloatyLogger.info "The request has been fulfilled"
|
67
67
|
check_ondemandvm(verbose, request_id, url)
|
68
68
|
end
|
69
69
|
|
data/lib/vmfloaty/service.rb
CHANGED
@@ -7,11 +7,13 @@ require 'vmfloaty/ssh'
|
|
7
7
|
|
8
8
|
class Service
|
9
9
|
attr_reader :config
|
10
|
+
attr_accessor :silent
|
10
11
|
|
11
12
|
def initialize(options, config_hash = {})
|
12
13
|
options ||= Commander::Command::Options.new
|
13
14
|
@config = Utils.get_service_config config_hash, options
|
14
15
|
@service_object = Utils.get_service_object @config['type']
|
16
|
+
@silent = false
|
15
17
|
end
|
16
18
|
|
17
19
|
def method_missing(method_name, *args, &block)
|
@@ -36,7 +38,7 @@ class Service
|
|
36
38
|
|
37
39
|
def user
|
38
40
|
unless @config['user']
|
39
|
-
|
41
|
+
FloatyLogger.info "Enter your #{@config['url']} service username:"
|
40
42
|
@config['user'] = STDIN.gets.chomp
|
41
43
|
end
|
42
44
|
@config['user']
|
@@ -44,7 +46,7 @@ class Service
|
|
44
46
|
|
45
47
|
def token
|
46
48
|
unless @config['token']
|
47
|
-
|
49
|
+
FloatyLogger.info 'No token found. Retrieving a token...'
|
48
50
|
@config['token'] = get_new_token(nil)
|
49
51
|
end
|
50
52
|
@config['token']
|
@@ -75,10 +77,10 @@ class Service
|
|
75
77
|
@service_object.list_active verbose, url, token, user
|
76
78
|
end
|
77
79
|
|
78
|
-
def retrieve(verbose, os_types, use_token = true, ondemand = nil)
|
79
|
-
|
80
|
+
def retrieve(verbose, os_types, use_token = true, ondemand = nil, continue = nil)
|
81
|
+
FloatyLogger.info 'Requesting a vm without a token...' unless use_token
|
80
82
|
token_value = use_token ? token : nil
|
81
|
-
@service_object.retrieve verbose, os_types, token_value, url, user, @config, ondemand
|
83
|
+
@service_object.retrieve verbose, os_types, token_value, url, user, @config, ondemand, continue
|
82
84
|
end
|
83
85
|
|
84
86
|
def wait_for_request(verbose, requestid)
|
@@ -91,27 +93,19 @@ class Service
|
|
91
93
|
begin
|
92
94
|
token_value = token || get_new_token(verbose)
|
93
95
|
rescue TokenError => e
|
94
|
-
|
95
|
-
|
96
|
+
FloatyLogger.error e
|
97
|
+
FloatyLogger.info 'Could not get token... requesting vm without a token anyway...'
|
96
98
|
end
|
97
99
|
end
|
98
100
|
Ssh.ssh(verbose, self, host_os, token_value)
|
99
101
|
end
|
100
102
|
|
101
|
-
def pretty_print_running(verbose, hostnames = [])
|
102
|
-
if hostnames.empty?
|
103
|
-
puts 'You have no running VMs.'
|
104
|
-
else
|
105
|
-
puts 'Running VMs:'
|
106
|
-
@service_object.pretty_print_hosts(verbose, hostnames, url)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
103
|
def query(verbose, hostname)
|
111
104
|
@service_object.query verbose, url, hostname
|
112
105
|
end
|
113
106
|
|
114
107
|
def modify(verbose, hostname, modify_hash)
|
108
|
+
maybe_use_vmpooler
|
115
109
|
@service_object.modify verbose, url, hostname, token, modify_hash
|
116
110
|
end
|
117
111
|
|
@@ -124,18 +118,35 @@ class Service
|
|
124
118
|
end
|
125
119
|
|
126
120
|
def summary(verbose)
|
121
|
+
maybe_use_vmpooler
|
127
122
|
@service_object.summary verbose, url
|
128
123
|
end
|
129
124
|
|
130
125
|
def snapshot(verbose, hostname)
|
126
|
+
maybe_use_vmpooler
|
131
127
|
@service_object.snapshot verbose, url, hostname, token
|
132
128
|
end
|
133
129
|
|
134
130
|
def revert(verbose, hostname, snapshot_sha)
|
131
|
+
maybe_use_vmpooler
|
135
132
|
@service_object.revert verbose, url, hostname, token, snapshot_sha
|
136
133
|
end
|
137
134
|
|
138
135
|
def disk(verbose, hostname, disk)
|
136
|
+
maybe_use_vmpooler
|
139
137
|
@service_object.disk(verbose, url, hostname, token, disk)
|
140
138
|
end
|
139
|
+
|
140
|
+
# some methods do not exist for ABS, and if possible should target the Pooler service
|
141
|
+
def maybe_use_vmpooler
|
142
|
+
if @service_object == ABS # this is not an instance
|
143
|
+
if !self.silent
|
144
|
+
FloatyLogger.info "The service in use is ABS, but the requested method should run against vmpooler directly, using fallback_vmpooler config from ~/.vmfloaty.yml"
|
145
|
+
self.silent = true
|
146
|
+
end
|
147
|
+
|
148
|
+
@config = Utils.get_vmpooler_service_config(@config['vmpooler_fallback'])
|
149
|
+
@service_object = Pooler
|
150
|
+
end
|
151
|
+
end
|
141
152
|
end
|
data/lib/vmfloaty/utils.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'vmfloaty/abs'
|
4
4
|
require 'vmfloaty/nonstandard_pooler'
|
5
5
|
require 'vmfloaty/pooler'
|
6
|
+
require 'vmfloaty/conf'
|
6
7
|
|
7
8
|
class Utils
|
8
9
|
# TODO: Takes the json response body from an HTTP GET
|
@@ -45,7 +46,10 @@ class Utils
|
|
45
46
|
|
46
47
|
result = {}
|
47
48
|
|
48
|
-
|
49
|
+
# ABS has a job_id associated with hosts so pass that along
|
50
|
+
abs_job_id = response_body.delete('job_id')
|
51
|
+
result['job_id'] = abs_job_id unless abs_job_id.nil?
|
52
|
+
|
49
53
|
filtered_response_body = response_body.reject { |key, _| key == 'request_id' || key == 'ready' }
|
50
54
|
filtered_response_body.each do |os, value|
|
51
55
|
hostnames = Array(value['hostname'])
|
@@ -58,7 +62,8 @@ class Utils
|
|
58
62
|
|
59
63
|
def self.format_host_output(hosts)
|
60
64
|
hosts.flat_map do |os, names|
|
61
|
-
|
65
|
+
# Assume hosts are stored in Arrays and ignore everything else
|
66
|
+
names.map { |name| "- #{name} (#{os})" } if names.is_a? Array
|
62
67
|
end.join("\n")
|
63
68
|
end
|
64
69
|
|
@@ -79,41 +84,96 @@ class Utils
|
|
79
84
|
os_types
|
80
85
|
end
|
81
86
|
|
82
|
-
def self.
|
87
|
+
def self.print_fqdn_for_host(service, hostname, host_data)
|
88
|
+
case service.type
|
89
|
+
when 'ABS'
|
90
|
+
abs_hostnames = []
|
91
|
+
|
92
|
+
host_data['allocated_resources'].each do |vm_name, _i|
|
93
|
+
abs_hostnames << vm_name['hostname']
|
94
|
+
end
|
95
|
+
|
96
|
+
puts abs_hostnames.join("\n")
|
97
|
+
when 'Pooler'
|
98
|
+
puts "#{hostname}.#{host_data['domain']}"
|
99
|
+
when 'NonstandardPooler'
|
100
|
+
puts host_data['fqdn']
|
101
|
+
else
|
102
|
+
raise "Invalid service type #{service.type}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.pretty_print_hosts(verbose, service, hostnames = [], print_to_stderr = false, indent = 0)
|
107
|
+
output_target = print_to_stderr ? $stderr : $stdout
|
108
|
+
|
109
|
+
fetched_data = self.get_host_data(verbose, service, hostnames)
|
110
|
+
fetched_data.each do |hostname, host_data|
|
111
|
+
case service.type
|
112
|
+
when 'ABS'
|
113
|
+
# For ABS, 'hostname' variable is the jobID
|
114
|
+
#
|
115
|
+
# Create a vmpooler service to query each hostname there so as to get the metadata too
|
116
|
+
|
117
|
+
output_target.puts "- [JobID:#{host_data['request']['job']['id']}] <#{host_data['state']}>"
|
118
|
+
host_data['allocated_resources'].each do |allocated_resources, _i|
|
119
|
+
if (allocated_resources['engine'] == "vmpooler" || allocated_resources['engine'] == 'ondemand') && service.config["vmpooler_fallback"]
|
120
|
+
vmpooler_service = service.clone
|
121
|
+
vmpooler_service.silent = true
|
122
|
+
vmpooler_service.maybe_use_vmpooler
|
123
|
+
self.pretty_print_hosts(verbose, vmpooler_service, allocated_resources['hostname'].split('.')[0], print_to_stderr, indent+2)
|
124
|
+
else
|
125
|
+
#TODO we could add more specific metadata for the other services, nspooler and aws
|
126
|
+
output_target.puts " - #{allocated_resources['hostname']} (#{allocated_resources['type']})"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
when 'Pooler'
|
130
|
+
tag_pairs = []
|
131
|
+
tag_pairs = host_data['tags'].map { |key, value| "#{key}: #{value}" } unless host_data['tags'].nil?
|
132
|
+
duration = "#{host_data['running']}/#{host_data['lifetime']} hours"
|
133
|
+
metadata = [host_data['template'], duration, *tag_pairs]
|
134
|
+
output_target.puts "- #{hostname}.#{host_data['domain']} (#{metadata.join(', ')})".gsub(/^/, ' ' * indent)
|
135
|
+
when 'NonstandardPooler'
|
136
|
+
line = "- #{host_data['fqdn']} (#{host_data['os_triple']}"
|
137
|
+
line += ", #{host_data['hours_left_on_reservation']}h remaining"
|
138
|
+
line += ", reason: #{host_data['reserved_for_reason']}" unless host_data['reserved_for_reason'].empty?
|
139
|
+
line += ')'
|
140
|
+
output_target.puts line
|
141
|
+
else
|
142
|
+
raise "Invalid service type #{service.type}"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.get_host_data(verbose, service, hostnames = [])
|
148
|
+
result = {}
|
83
149
|
hostnames = [hostnames] unless hostnames.is_a? Array
|
84
150
|
hostnames.each do |hostname|
|
85
151
|
begin
|
86
152
|
response = service.query(verbose, hostname)
|
87
153
|
host_data = response[hostname]
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
154
|
+
if block_given?
|
155
|
+
yield host_data result
|
156
|
+
else
|
157
|
+
case service.type
|
158
|
+
when 'ABS'
|
159
|
+
# For ABS, 'hostname' variable is the jobID
|
160
|
+
if host_data['state'] == 'allocated' || host_data['state'] == 'filled'
|
161
|
+
result[hostname] = host_data
|
95
162
|
end
|
163
|
+
when 'Pooler'
|
164
|
+
result[hostname] = host_data
|
165
|
+
when 'NonstandardPooler'
|
166
|
+
result[hostname] = host_data
|
167
|
+
else
|
168
|
+
raise "Invalid service type #{service.type}"
|
96
169
|
end
|
97
|
-
when 'Pooler'
|
98
|
-
tag_pairs = []
|
99
|
-
tag_pairs = host_data['tags'].map { |key, value| "#{key}: #{value}" } unless host_data['tags'].nil?
|
100
|
-
duration = "#{host_data['running']}/#{host_data['lifetime']} hours"
|
101
|
-
metadata = [host_data['template'], duration, *tag_pairs]
|
102
|
-
puts "- #{hostname}.#{host_data['domain']} (#{metadata.join(', ')})"
|
103
|
-
when 'NonstandardPooler'
|
104
|
-
line = "- #{host_data['fqdn']} (#{host_data['os_triple']}"
|
105
|
-
line += ", #{host_data['hours_left_on_reservation']}h remaining"
|
106
|
-
line += ", reason: #{host_data['reserved_for_reason']}" unless host_data['reserved_for_reason'].empty?
|
107
|
-
line += ')'
|
108
|
-
puts line
|
109
|
-
else
|
110
|
-
raise "Invalid service type #{service.type}"
|
111
170
|
end
|
112
171
|
rescue StandardError => e
|
113
|
-
|
114
|
-
|
172
|
+
FloatyLogger.error("Something went wrong while trying to gather information on #{hostname}:")
|
173
|
+
FloatyLogger.error(e)
|
115
174
|
end
|
116
175
|
end
|
176
|
+
result
|
117
177
|
end
|
118
178
|
|
119
179
|
def self.pretty_print_status(verbose, service)
|
@@ -135,7 +195,7 @@ class Utils
|
|
135
195
|
char = 'o'
|
136
196
|
puts "#{name.ljust(width)} #{(char * ready).green}#{(char * pending).yellow}#{(char * missing).red}"
|
137
197
|
rescue StandardError => e
|
138
|
-
|
198
|
+
FloatyLogger.error "#{name.ljust(width)} #{e.red}"
|
139
199
|
end
|
140
200
|
end
|
141
201
|
puts message.colorize(status_response['status']['ok'] ? :default : :red)
|
@@ -154,11 +214,11 @@ class Utils
|
|
154
214
|
char = 'o'
|
155
215
|
puts "#{name.ljust(width)} #{(char * ready).green}#{(char * pending).yellow}#{(char * missing).red}"
|
156
216
|
rescue StandardError => e
|
157
|
-
|
217
|
+
FloatyLogger.error "#{name.ljust(width)} #{e.red}"
|
158
218
|
end
|
159
219
|
end
|
160
220
|
when 'ABS'
|
161
|
-
|
221
|
+
FloatyLogger.error 'ABS Not OK' unless status_response
|
162
222
|
puts 'ABS is OK'.green if status_response
|
163
223
|
else
|
164
224
|
raise "Invalid service type #{service.type}"
|
@@ -174,12 +234,15 @@ class Utils
|
|
174
234
|
end
|
175
235
|
|
176
236
|
def self.get_service_object(type = '')
|
177
|
-
nspooler_strings = %w[ns nspooler nonstandard nonstandard_pooler]
|
178
237
|
abs_strings = %w[abs alwaysbescheduling always_be_scheduling]
|
179
|
-
|
180
|
-
|
181
|
-
|
238
|
+
nspooler_strings = %w[ns nspooler nonstandard nonstandard_pooler]
|
239
|
+
vmpooler_strings = %w[vmpooler]
|
240
|
+
if abs_strings.include? type.downcase
|
182
241
|
ABS
|
242
|
+
elsif nspooler_strings.include? type.downcase
|
243
|
+
NonstandardPooler
|
244
|
+
elsif vmpooler_strings.include? type.downcase
|
245
|
+
Pooler
|
183
246
|
else
|
184
247
|
Pooler
|
185
248
|
end
|
@@ -191,6 +254,7 @@ class Utils
|
|
191
254
|
'url' => config['url'],
|
192
255
|
'user' => config['user'],
|
193
256
|
'token' => config['token'],
|
257
|
+
'vmpooler_fallback' => config['vmpooler_fallback'],
|
194
258
|
'type' => config['type'] || 'vmpooler',
|
195
259
|
}
|
196
260
|
|
@@ -207,6 +271,9 @@ class Utils
|
|
207
271
|
# If the service is configured but some values are missing, use the top-level defaults to fill them in
|
208
272
|
service_config.merge! config['services'][options.service]
|
209
273
|
end
|
274
|
+
# No config file but service is declared on command line
|
275
|
+
elsif !config['services'] && options.service
|
276
|
+
service_config['type'] = options.service
|
210
277
|
end
|
211
278
|
|
212
279
|
# Prioritize an explicitly specified url, user, or token if the user provided one
|
@@ -217,4 +284,30 @@ class Utils
|
|
217
284
|
|
218
285
|
service_config
|
219
286
|
end
|
287
|
+
|
288
|
+
# This method gets the vmpooler service configured in ~/.vmfloaty
|
289
|
+
def self.get_vmpooler_service_config(vmpooler_fallback)
|
290
|
+
config = Conf.read_config
|
291
|
+
# The top-level url, user, and token values in the config file are treated as defaults
|
292
|
+
service_config = {
|
293
|
+
'url' => config['url'],
|
294
|
+
'user' => config['user'],
|
295
|
+
'token' => config['token'],
|
296
|
+
'type' => 'vmpooler',
|
297
|
+
}
|
298
|
+
|
299
|
+
# at a minimum, the url needs to be configured
|
300
|
+
if config['services'] && config['services'][vmpooler_fallback] && config['services'][vmpooler_fallback]['url']
|
301
|
+
# If the service is configured but some values are missing, use the top-level defaults to fill them in
|
302
|
+
service_config.merge! config['services'][vmpooler_fallback]
|
303
|
+
else
|
304
|
+
if vmpooler_fallback.nil?
|
305
|
+
raise ArgumentError, "The abs service should have a key named 'vmpooler_fallback' in ~/.vmfloaty.yml with a value that points to a vmpooler service name use this format:\nservices:\n myabs:\n url: 'http://abs.com'\n user: 'superman'\n token: 'kryptonite'\n vmpooler_fallback: 'myvmpooler'\n myvmpooler:\n url: 'http://vmpooler.com'\n user: 'superman'\n token: 'kryptonite'"
|
306
|
+
else
|
307
|
+
raise ArgumentError, "Could not find a configured service named '#{vmpooler_fallback}' in ~/.vmfloaty.yml use this format:\nservices:\n #{vmpooler_fallback}:\n url: 'http://vmpooler.com'\n user: 'superman'\n token: 'kryptonite'"
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
service_config
|
312
|
+
end
|
220
313
|
end
|
data/lib/vmfloaty/version.rb
CHANGED
data/spec/vmfloaty/abs_spec.rb
CHANGED
@@ -9,15 +9,60 @@ describe ABS do
|
|
9
9
|
before :each do
|
10
10
|
end
|
11
11
|
|
12
|
+
describe '#list' do
|
13
|
+
it 'skips empty platforms and lists aws' do
|
14
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/vmpooler").
|
15
|
+
to_return(:status => 200, :body => "", :headers => {})
|
16
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/ondemand_vmpooler").
|
17
|
+
to_return(:status => 200, :body => "", :headers => {})
|
18
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/nspooler").
|
19
|
+
to_return(:status => 200, :body => "", :headers => {})
|
20
|
+
body = '{
|
21
|
+
"aws_platforms": [
|
22
|
+
"amazon-6-x86_64",
|
23
|
+
"amazon-7-x86_64",
|
24
|
+
"amazon-7-arm64",
|
25
|
+
"centos-7-x86-64-west",
|
26
|
+
"redhat-8-arm64"
|
27
|
+
]
|
28
|
+
}'
|
29
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/aws").
|
30
|
+
to_return(:status => 200, :body => body, :headers => {})
|
31
|
+
|
32
|
+
|
33
|
+
results = ABS.list(false, "http://foo")
|
34
|
+
|
35
|
+
expect(results).to include("amazon-6-x86_64", "amazon-7-x86_64", "amazon-7-arm64", "centos-7-x86-64-west", "redhat-8-arm64")
|
36
|
+
end
|
37
|
+
it 'legacy JSON string, prior to PR 306' do
|
38
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/vmpooler").
|
39
|
+
to_return(:status => 200, :body => "", :headers => {})
|
40
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/ondemand_vmpooler").
|
41
|
+
to_return(:status => 200, :body => "", :headers => {})
|
42
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/nspooler").
|
43
|
+
to_return(:status => 200, :body => "", :headers => {})
|
44
|
+
body = '{
|
45
|
+
"aws_platforms": "[\"amazon-6-x86_64\",\"amazon-7-x86_64\",\"amazon-7-arm64\",\"centos-7-x86-64-west\",\"redhat-8-arm64\"]"
|
46
|
+
}'
|
47
|
+
stub_request(:get, "http://foo/api/v2/status/platforms/aws").
|
48
|
+
to_return(:status => 200, :body => body, :headers => {})
|
49
|
+
|
50
|
+
results = ABS.list(false, "http://foo")
|
51
|
+
|
52
|
+
expect(results).to include("amazon-6-x86_64", "amazon-7-x86_64", "amazon-7-arm64", "centos-7-x86-64-west", "redhat-8-arm64")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
12
56
|
describe '#format' do
|
13
|
-
it 'returns an hash formatted like a vmpooler return' do
|
57
|
+
it 'returns an hash formatted like a vmpooler return, plus the job_id' do
|
58
|
+
job_id = "generated_by_floaty_12345"
|
14
59
|
abs_formatted_response = [
|
15
60
|
{ 'hostname' => 'aaaaaaaaaaaaaaa.delivery.puppetlabs.net', 'type' => 'centos-7.2-x86_64', 'engine' => 'vmpooler' },
|
16
61
|
{ 'hostname' => 'aaaaaaaaaaaaaab.delivery.puppetlabs.net', 'type' => 'centos-7.2-x86_64', 'engine' => 'vmpooler' },
|
17
62
|
{ 'hostname' => 'aaaaaaaaaaaaaac.delivery.puppetlabs.net', 'type' => 'ubuntu-7.2-x86_64', 'engine' => 'vmpooler' },
|
18
63
|
]
|
19
64
|
|
20
|
-
vmpooler_formatted_response = ABS.translated(abs_formatted_response)
|
65
|
+
vmpooler_formatted_response = ABS.translated(abs_formatted_response, job_id)
|
21
66
|
|
22
67
|
vmpooler_formatted_compare = {
|
23
68
|
'centos-7.2-x86_64' => {},
|
@@ -29,6 +74,8 @@ describe ABS do
|
|
29
74
|
|
30
75
|
vmpooler_formatted_compare['ok'] = true
|
31
76
|
|
77
|
+
vmpooler_formatted_compare['job_id'] = job_id
|
78
|
+
|
32
79
|
expect(vmpooler_formatted_response).to eq(vmpooler_formatted_compare)
|
33
80
|
vmpooler_formatted_response.delete('ok')
|
34
81
|
vmpooler_formatted_compare.delete('ok')
|
@@ -68,9 +115,9 @@ describe ABS do
|
|
68
115
|
# rubocop:disable Layout/LineLength
|
69
116
|
@active_requests_response = '
|
70
117
|
[
|
71
|
-
|
118
|
+
{ "state":"allocated","last_processed":"2019-12-16 23:00:34 +0000","allocated_resources":[{"hostname":"take-this.delivery.puppetlabs.net","type":"win-2012r2-x86_64","engine":"vmpooler"}],"audit_log":{"2019-12-13 16:45:29 +0000":"Allocated take-this.delivery.puppetlabs.net for job 1576255517241"},"request":{"resources":{"win-2012r2-x86_64":1},"job":{"id":"1576255517241","tags":{"user":"test-user"},"user":"test-user","time-received":1576255519},"priority":1}},
|
72
119
|
"null",
|
73
|
-
|
120
|
+
{"state":"allocated","last_processed":"2019-12-16 23:00:34 +0000","allocated_resources":[{"hostname":"not-this.delivery.puppetlabs.net","type":"win-2012r2-x86_64","engine":"vmpooler"}],"audit_log":{"2019-12-13 16:46:14 +0000":"Allocated not-this.delivery.puppetlabs.net for job 1576255565159"},"request":{"resources":{"win-2012r2-x86_64":1},"job":{"id":"1576255565159","tags":{"user":"not-test-user"},"user":"not-test-user","time-received":1576255566},"priority":1}}
|
74
121
|
]'
|
75
122
|
# rubocop:enable Layout/LineLength
|
76
123
|
@token = 'utpg2i2xswor6h8ttjhu3d47z53yy47y'
|
@@ -78,7 +125,7 @@ describe ABS do
|
|
78
125
|
end
|
79
126
|
|
80
127
|
it 'will skip a line with a null value returned from abs' do
|
81
|
-
stub_request(:get, 'https://abs.example.com/status/queue')
|
128
|
+
stub_request(:get, 'https://abs.example.com/api/v2/status/queue')
|
82
129
|
.to_return(:status => 200, :body => @active_requests_response, :headers => {})
|
83
130
|
|
84
131
|
ret = ABS.get_active_requests(false, @abs_url, @test_user)
|
@@ -98,7 +145,7 @@ describe ABS do
|
|
98
145
|
# rubocop:disable Layout/LineLength
|
99
146
|
@active_requests_response = '
|
100
147
|
[
|
101
|
-
|
148
|
+
{ "state":"allocated", "last_processed":"2020-01-17 22:29:13 +0000", "allocated_resources":[{"hostname":"craggy-chord.delivery.puppetlabs.net", "type":"centos-7-x86_64", "engine":"vmpooler"}, {"hostname":"visible-revival.delivery.puppetlabs.net", "type":"centos-7-x86_64", "engine":"vmpooler"}], "audit_log":{"2020-01-17 22:28:45 +0000":"Allocated craggy-chord.delivery.puppetlabs.net, visible-revival.delivery.puppetlabs.net for job 1579300120799"}, "request":{"resources":{"centos-7-x86_64":2}, "job":{"id":"1579300120799", "tags":{"user":"test-user"}, "user":"test-user", "time-received":1579300120}, "priority":3}}
|
102
149
|
]'
|
103
150
|
@return_request = { '{"job_id":"1579300120799","hosts":{"hostname":"craggy-chord.delivery.puppetlabs.net","type":"centos-7-x86_64","engine":"vmpooler"},{"hostname":"visible-revival.delivery.puppetlabs.net","type":"centos-7-x86_64","engine":"vmpooler"}}'=>true }
|
104
151
|
# rubocop:enable Layout/LineLength
|
@@ -109,9 +156,9 @@ describe ABS do
|
|
109
156
|
end
|
110
157
|
|
111
158
|
it 'will delete the whole job' do
|
112
|
-
stub_request(:get, 'https://abs.example.com/status/queue')
|
159
|
+
stub_request(:get, 'https://abs.example.com/api/v2/status/queue')
|
113
160
|
.to_return(:status => 200, :body => @active_requests_response, :headers => {})
|
114
|
-
stub_request(:post, 'https://abs.example.com/return')
|
161
|
+
stub_request(:post, 'https://abs.example.com/api/v2/return')
|
115
162
|
.with(:body => @return_request)
|
116
163
|
.to_return(:status => 200, :body => 'OK', :headers => {})
|
117
164
|
|