cuboid 0.2.11 → 0.2.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cuboid.gemspec +10 -10
- data/lib/cuboid/rest/server/routes/instances.rb +25 -0
- data/lib/cuboid/rpc/server/application_wrapper.rb +5 -4
- data/lib/cuboid/rpc/server/instance.rb +8 -1
- data/lib/cuboid/state/application.rb +1 -0
- data/lib/version +1 -1
- data/spec/cuboid/rest/server_spec.rb +73 -1
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ead3ec0a010bda785e92188f13865859de5804c715d6dae6f8e776128b48b6b
|
4
|
+
data.tar.gz: 947a1bf5fc9e352d2ef4900d1978eced4e000da8f31d363ee84ba6583b8e6ac2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3ded914a1ba511dbde6c0bf6c1a21e02b46ccf0d06c09ed7c9c048da86a4dd1b2e0c793cc76a8c40a0293b892b2b70e8e514717520df9fb16448b5c2157caa8
|
7
|
+
data.tar.gz: 575d197f5ddb1135eef2a296b316e83613d420f191630094ef15b780698d3900ac746ab1225618e7c451fe52c66fccabb2aca569238e515a8ad58594caaa30e5
|
data/cuboid.gemspec
CHANGED
@@ -31,31 +31,31 @@ Gem::Specification.new do |s|
|
|
31
31
|
# latest one.
|
32
32
|
s.add_dependency 'bundler'
|
33
33
|
|
34
|
-
s.add_dependency 'concurrent-ruby', '~> 1.
|
35
|
-
s.add_dependency 'concurrent-ruby-ext', '~> 1.
|
34
|
+
s.add_dependency 'concurrent-ruby', '~> 1.3.4'
|
35
|
+
s.add_dependency 'concurrent-ruby-ext', '~> 1.3.4'
|
36
36
|
|
37
37
|
# For compressing/decompressing system state archives.
|
38
|
-
s.add_dependency 'rubyzip', '~> 2.
|
38
|
+
s.add_dependency 'rubyzip', '~> 2.4.1'
|
39
39
|
|
40
|
-
s.add_dependency 'childprocess', '~> 5.
|
40
|
+
s.add_dependency 'childprocess', '~> 5.1.0'
|
41
41
|
|
42
42
|
# RPC serialization.
|
43
|
-
s.add_dependency 'msgpack', '~> 1.7.
|
43
|
+
s.add_dependency 'msgpack', '~> 1.7.5'
|
44
44
|
|
45
45
|
# Web server
|
46
|
-
s.add_dependency 'puma', '~> 6.
|
46
|
+
s.add_dependency 'puma', '~> 6.5.0'
|
47
47
|
|
48
|
-
s.add_dependency 'rack', '2.2.
|
48
|
+
s.add_dependency 'rack', '2.2.9'
|
49
49
|
s.add_dependency 'rack-test'
|
50
50
|
|
51
51
|
# REST API
|
52
|
-
s.add_dependency 'sinatra', '2.2.
|
53
|
-
s.add_dependency 'sinatra-contrib', '2.2.
|
52
|
+
s.add_dependency 'sinatra', '2.2.3'
|
53
|
+
s.add_dependency 'sinatra-contrib', '2.2.3'
|
54
54
|
|
55
55
|
# RPC client/server implementation.
|
56
56
|
s.add_dependency 'toq', '~> 0.1.0'
|
57
57
|
|
58
|
-
s.add_dependency 'vmstat', '~> 2.3.
|
58
|
+
s.add_dependency 'vmstat', '~> 2.3.1'
|
59
59
|
s.add_dependency 'sys-proctable', '~> 1.3.0'
|
60
60
|
|
61
61
|
s.description = <<DESCRIPTION
|
@@ -32,6 +32,23 @@ module Instances
|
|
32
32
|
json id: instance.token
|
33
33
|
end
|
34
34
|
|
35
|
+
app.post '/instances/restore' do
|
36
|
+
max_utilization! if !agent && System.max_utilization?
|
37
|
+
|
38
|
+
options = ::JSON.load( request.body.read ) || {}
|
39
|
+
|
40
|
+
instance = get_instance
|
41
|
+
max_utilization! if !instance
|
42
|
+
|
43
|
+
handle_error proc { instance.shutdown } do
|
44
|
+
instance.restore!( options['session'] )
|
45
|
+
end
|
46
|
+
|
47
|
+
instances[instance.token] = instance
|
48
|
+
|
49
|
+
json id: instance.token
|
50
|
+
end
|
51
|
+
|
35
52
|
# Progress
|
36
53
|
app.get '/instances/:instance' do
|
37
54
|
ensure_instance!
|
@@ -106,6 +123,14 @@ module Instances
|
|
106
123
|
end
|
107
124
|
end
|
108
125
|
|
126
|
+
app.put '/instances/:instance/abort' do
|
127
|
+
ensure_instance!
|
128
|
+
|
129
|
+
instance_for( params[:instance] ) do |instance|
|
130
|
+
json instance.abort!
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
109
134
|
# Abort/shutdown
|
110
135
|
app.delete '/instances/:instance' do
|
111
136
|
ensure_instance!
|
@@ -44,7 +44,7 @@ class ApplicationWrapper
|
|
44
44
|
# `true` If the system is scanning, `false` if {#run} hasn't been called
|
45
45
|
# yet or if the scan has finished.
|
46
46
|
def busy?
|
47
|
-
![:ready, :done, :suspended].include?( @application.status ) &&
|
47
|
+
![:ready, :done, :suspended, :aborted].include?( @application.status ) &&
|
48
48
|
!!@extended_running
|
49
49
|
end
|
50
50
|
|
@@ -58,6 +58,7 @@ class ApplicationWrapper
|
|
58
58
|
# Start the scan -- we can't block the RPC server so we're using a Thread.
|
59
59
|
Thread.new do
|
60
60
|
@application.run
|
61
|
+
@extended_running = false
|
61
62
|
end
|
62
63
|
|
63
64
|
true
|
@@ -66,10 +67,10 @@ class ApplicationWrapper
|
|
66
67
|
def clean_up
|
67
68
|
return false if @rpc_cleaned_up
|
68
69
|
|
70
|
+
@application.clean_up
|
71
|
+
|
69
72
|
@rpc_cleaned_up = true
|
70
73
|
@extended_running = false
|
71
|
-
|
72
|
-
@application.clean_up
|
73
74
|
end
|
74
75
|
|
75
76
|
# @param [Integer] starting_line
|
@@ -109,7 +110,7 @@ class ApplicationWrapper
|
|
109
110
|
|
110
111
|
data = {
|
111
112
|
status: status,
|
112
|
-
busy:
|
113
|
+
busy: @extended_running,
|
113
114
|
application: @application.class.to_s,
|
114
115
|
seed: Utilities.random_seed,
|
115
116
|
agent_url: Cuboid::Options.agent.url,
|
@@ -103,8 +103,15 @@ class Instance
|
|
103
103
|
# @see #suspend
|
104
104
|
# @see #snapshot_path
|
105
105
|
def restore!( snapshot )
|
106
|
+
# If the instance isn't clean bail out now.
|
107
|
+
return false if busy? || @called
|
108
|
+
|
109
|
+
@called = @run_initializing = true
|
110
|
+
|
106
111
|
Thread.new do
|
107
|
-
@application.restore!( snapshot )
|
112
|
+
@application.restore!( snapshot )
|
113
|
+
@application.run
|
114
|
+
@run_initializing = false
|
108
115
|
end
|
109
116
|
|
110
117
|
true
|
data/lib/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.13
|
@@ -251,6 +251,26 @@ describe Cuboid::Rest::Server do
|
|
251
251
|
end
|
252
252
|
end
|
253
253
|
|
254
|
+
describe 'POST /instances/restore' do
|
255
|
+
let(:tpl_url) { '/instances/restore' }
|
256
|
+
|
257
|
+
it 'creates an instance from a restores session'
|
258
|
+
|
259
|
+
context 'when given invalid options' do
|
260
|
+
it 'returns a 500'
|
261
|
+
|
262
|
+
it 'does not list the instance on the index'
|
263
|
+
end
|
264
|
+
|
265
|
+
context 'when the system is at max utilization' do
|
266
|
+
it 'returns a 503'
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'when a Agent has been set' do
|
270
|
+
it 'uses it'
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
254
274
|
describe 'GET /instances/:instance' do
|
255
275
|
let(:tpl_url) { '/instances/%s' }
|
256
276
|
|
@@ -567,7 +587,59 @@ describe Cuboid::Rest::Server do
|
|
567
587
|
end
|
568
588
|
end
|
569
589
|
end
|
570
|
-
|
590
|
+
|
591
|
+
describe 'PUT /instances/:instance/abort' do
|
592
|
+
let(:tpl_url) { '/instances/%s/abort' }
|
593
|
+
|
594
|
+
before do
|
595
|
+
@id = create_instance
|
596
|
+
end
|
597
|
+
|
598
|
+
it 'aborts the instance' do
|
599
|
+
put url
|
600
|
+
expect(response_code).to eq 200
|
601
|
+
|
602
|
+
get "/instances/#{id}"
|
603
|
+
expect(['aborting', 'aborted']).to include response_data['status']
|
604
|
+
end
|
605
|
+
|
606
|
+
context 'when passed a non-existent id' do
|
607
|
+
let(:id) { non_existent_id }
|
608
|
+
|
609
|
+
it 'returns 404' do
|
610
|
+
put url
|
611
|
+
expect(response_code).to eq 404
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
context 'when the instance is from the Scheduler' do
|
616
|
+
before do
|
617
|
+
put '/scheduler/url', scheduler.url
|
618
|
+
end
|
619
|
+
|
620
|
+
it 'includes it' do
|
621
|
+
@id = scheduler.push( options )
|
622
|
+
sleep 0.1 while scheduler.running.empty?
|
623
|
+
|
624
|
+
put url
|
625
|
+
expect(response_code).to eq 200
|
626
|
+
|
627
|
+
get "/instances/#{id}"
|
628
|
+
expect(['aborting', 'aborted']).to include response_data['status']
|
629
|
+
end
|
630
|
+
|
631
|
+
context 'when the instance completes' do
|
632
|
+
it 'is removed' do
|
633
|
+
@id = scheduler.push( options )
|
634
|
+
sleep 0.1 while scheduler.completed.empty?
|
635
|
+
|
636
|
+
put url
|
637
|
+
expect(response_code).to be 404
|
638
|
+
end
|
639
|
+
end
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
571
643
|
describe 'DELETE /instances/:instance' do
|
572
644
|
let(:tpl_url) { '/instances/%s' }
|
573
645
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cuboid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tasos Laskos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -44,98 +44,98 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: 1.3.4
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: 1.3.4
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: concurrent-ruby-ext
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
61
|
+
version: 1.3.4
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
68
|
+
version: 1.3.4
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rubyzip
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 2.
|
75
|
+
version: 2.4.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.
|
82
|
+
version: 2.4.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: childprocess
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 5.
|
89
|
+
version: 5.1.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 5.
|
96
|
+
version: 5.1.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: msgpack
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.7.
|
103
|
+
version: 1.7.5
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.7.
|
110
|
+
version: 1.7.5
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: puma
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 6.
|
117
|
+
version: 6.5.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 6.
|
124
|
+
version: 6.5.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rack
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 2.2.
|
131
|
+
version: 2.2.9
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - '='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 2.2.
|
138
|
+
version: 2.2.9
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: rack-test
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,28 +156,28 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - '='
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 2.2.
|
159
|
+
version: 2.2.3
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - '='
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: 2.2.
|
166
|
+
version: 2.2.3
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: sinatra-contrib
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - '='
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: 2.2.
|
173
|
+
version: 2.2.3
|
174
174
|
type: :runtime
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - '='
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: 2.2.
|
180
|
+
version: 2.2.3
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: toq
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +198,14 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: 2.3.
|
201
|
+
version: 2.3.1
|
202
202
|
type: :runtime
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 2.3.
|
208
|
+
version: 2.3.1
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: sys-proctable
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|