marathon-api 1.3.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/marathon.rb +7 -7
- data/lib/marathon/app.rb +18 -16
- data/lib/marathon/deployment.rb +8 -6
- data/lib/marathon/deployment_info.rb +3 -2
- data/lib/marathon/event_subscriptions.rb +2 -2
- data/lib/marathon/group.rb +100 -30
- data/lib/marathon/leader.rb +2 -2
- data/lib/marathon/queue.rb +5 -4
- data/lib/marathon/task.rb +8 -6
- data/lib/marathon/version.rb +1 -1
- data/spec/marathon/app_spec.rb +107 -69
- data/spec/marathon/deployment_info_spec.rb +11 -7
- data/spec/marathon/deployment_spec.rb +12 -8
- data/spec/marathon/group_spec.rb +34 -22
- data/spec/marathon/queue_spec.rb +3 -3
- data/spec/marathon/task_spec.rb +3 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2655f3b4c932dcf453acb970aa41f6ae9ff774d
|
4
|
+
data.tar.gz: 6689f06c21c986ba2bcb23aae214bf98a4cc582e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7019da94e90e103908c78534428ca6dd93ad8319dacd04d49e332924dc1aa7fc146a93ab95d83f545e4e2a3392573ce1e3c082fae63feeeec427402a32175937
|
7
|
+
data.tar.gz: 29f7d9d5f14c50853c4234fdfaa840e20809ed5efb912b1f6a1374acb1c03edbaa93ed17ab2f487b1a806917e53d64b28dc0e76273b66214b0d7ebe542fd78ce
|
data/lib/marathon.rb
CHANGED
@@ -54,31 +54,31 @@ module Marathon
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def apps
|
57
|
-
Marathon::Apps.new(
|
57
|
+
Marathon::Apps.new(self)
|
58
58
|
end
|
59
59
|
|
60
60
|
def groups
|
61
|
-
Marathon::Groups.new(
|
61
|
+
Marathon::Groups.new(self)
|
62
62
|
end
|
63
63
|
|
64
64
|
def deployments
|
65
|
-
Marathon::Deployments.new(
|
65
|
+
Marathon::Deployments.new(self)
|
66
66
|
end
|
67
67
|
|
68
68
|
def tasks
|
69
|
-
Marathon::Tasks.new(
|
69
|
+
Marathon::Tasks.new(self)
|
70
70
|
end
|
71
71
|
|
72
72
|
def queues
|
73
|
-
Marathon::Queues.new(
|
73
|
+
Marathon::Queues.new(self)
|
74
74
|
end
|
75
75
|
|
76
76
|
def leaders
|
77
|
-
Marathon::Leader.new(
|
77
|
+
Marathon::Leader.new(self)
|
78
78
|
end
|
79
79
|
|
80
80
|
def event_subscriptions
|
81
|
-
Marathon::EventSubscriptions.new(
|
81
|
+
Marathon::EventSubscriptions.new(self)
|
82
82
|
end
|
83
83
|
|
84
84
|
end
|
data/lib/marathon/app.rb
CHANGED
@@ -19,10 +19,11 @@ class Marathon::App < Marathon::Base
|
|
19
19
|
# ++hash++: Hash including all attributes.
|
20
20
|
# See https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/apps for full details.
|
21
21
|
# ++read_only++: prevent actions on this application
|
22
|
-
def initialize(hash, read_only = false)
|
22
|
+
def initialize(hash, marathon_instance, read_only = false)
|
23
23
|
super(Marathon::Util.merge_keywordized_hash(DEFAULTS, hash), ACCESSORS)
|
24
24
|
raise ArgumentError, 'App must have an id' unless id
|
25
25
|
@read_only = read_only
|
26
|
+
@marathon_instance = marathon_instance
|
26
27
|
refresh_attributes
|
27
28
|
end
|
28
29
|
|
@@ -40,16 +41,16 @@ class Marathon::App < Marathon::Base
|
|
40
41
|
# else returns Hash with version information.
|
41
42
|
def versions(version = nil)
|
42
43
|
if version
|
43
|
-
|
44
|
+
@marathon_instance.apps.version(id, version)
|
44
45
|
else
|
45
|
-
|
46
|
+
@marathon_instance.apps.versions(id)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
50
|
# Reload attributes from marathon API.
|
50
51
|
def refresh
|
51
52
|
check_read_only
|
52
|
-
new_app =
|
53
|
+
new_app = @marathon_instance.apps.get(id)
|
53
54
|
@info = new_app.info
|
54
55
|
refresh_attributes
|
55
56
|
self
|
@@ -68,7 +69,7 @@ class Marathon::App < Marathon::Base
|
|
68
69
|
# The current deployment can be overridden by setting the `force` query parameter.
|
69
70
|
def restart!(force = false)
|
70
71
|
check_read_only
|
71
|
-
|
72
|
+
@marathon_instance.apps.restart(id, force)
|
72
73
|
end
|
73
74
|
|
74
75
|
# Change parameters of a running application.
|
@@ -86,7 +87,7 @@ class Marathon::App < Marathon::Base
|
|
86
87
|
else
|
87
88
|
new_hash = hash
|
88
89
|
end
|
89
|
-
|
90
|
+
@marathon_instance.apps.change(id, new_hash, force)
|
90
91
|
end
|
91
92
|
|
92
93
|
# Create a new version with parameters of an old version.
|
@@ -162,7 +163,7 @@ Version: #{version}
|
|
162
163
|
else
|
163
164
|
@container = nil
|
164
165
|
end
|
165
|
-
@tasks = (@info[:tasks] || []).map { |e| Marathon::Task.new(e) }
|
166
|
+
@tasks = (@info[:tasks] || []).map { |e| Marathon::Task.new(e, @marathon_instance) }
|
166
167
|
end
|
167
168
|
|
168
169
|
class << self
|
@@ -233,22 +234,23 @@ end
|
|
233
234
|
|
234
235
|
# This class represents a set of Apps
|
235
236
|
class Marathon::Apps
|
236
|
-
def initialize(
|
237
|
-
@
|
237
|
+
def initialize(marathon_instance)
|
238
|
+
@marathon_instance = marathon_instance
|
239
|
+
@connection = marathon_instance.connection
|
238
240
|
end
|
239
241
|
|
240
242
|
# List the application with id.
|
241
243
|
# ++id++: Application's id.
|
242
244
|
def get(id)
|
243
245
|
json = @connection.get("/v2/apps/#{id}")['app']
|
244
|
-
Marathon::App.new(json)
|
246
|
+
Marathon::App.new(json, @marathon_instance)
|
245
247
|
end
|
246
248
|
|
247
249
|
# Delete the application with id.
|
248
250
|
# ++id++: Application's id.
|
249
251
|
def delete(id)
|
250
252
|
json = @connection.delete("/v2/apps/#{id}")
|
251
|
-
Marathon::DeploymentInfo.new(json)
|
253
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
252
254
|
end
|
253
255
|
|
254
256
|
# Create and start an application.
|
@@ -256,7 +258,7 @@ class Marathon::Apps
|
|
256
258
|
# see https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/apps for full details
|
257
259
|
def start(hash)
|
258
260
|
json = @connection.post('/v2/apps', nil, :body => hash)
|
259
|
-
Marathon::App.new(json)
|
261
|
+
Marathon::App.new(json, @marathon_instance)
|
260
262
|
end
|
261
263
|
|
262
264
|
# Restart the application with id.
|
@@ -267,7 +269,7 @@ class Marathon::Apps
|
|
267
269
|
query = {}
|
268
270
|
query[:force] = true if force
|
269
271
|
json = @connection.post("/v2/apps/#{id}/restart", query)
|
270
|
-
Marathon::DeploymentInfo.new(json)
|
272
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
271
273
|
end
|
272
274
|
|
273
275
|
# Change parameters of a running application. The new application parameters apply only to subsequently
|
@@ -280,7 +282,7 @@ class Marathon::Apps
|
|
280
282
|
query = {}
|
281
283
|
query[:force] = true if force
|
282
284
|
json = @connection.put("/v2/apps/#{id}", query, :body => hash.merge(:id => id))
|
283
|
-
Marathon::DeploymentInfo.new(json)
|
285
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
284
286
|
end
|
285
287
|
|
286
288
|
# List the versions of the application with id.
|
@@ -295,7 +297,7 @@ class Marathon::Apps
|
|
295
297
|
# ++version++: Version name
|
296
298
|
def version(id, version)
|
297
299
|
json = @connection.get("/v2/apps/#{id}/versions/#{version}")
|
298
|
-
Marathon::App.new(json, true)
|
300
|
+
Marathon::App.new(json, @marathon_instance, true)
|
299
301
|
end
|
300
302
|
|
301
303
|
# List all applications.
|
@@ -318,7 +320,7 @@ class Marathon::Apps
|
|
318
320
|
Marathon::Util.add_choice(query, :embed, embed, %w[apps.tasks apps.counts
|
319
321
|
apps.deployments apps.lastTaskFailure apps.failures apps.taskStats ])
|
320
322
|
json = @connection.get('/v2/apps', query)['apps']
|
321
|
-
json.map { |j| Marathon::App.new(j) }
|
323
|
+
json.map { |j| Marathon::App.new(j, @marathon_instance) }
|
322
324
|
end
|
323
325
|
|
324
326
|
end
|
data/lib/marathon/deployment.rb
CHANGED
@@ -8,8 +8,9 @@ class Marathon::Deployment < Marathon::Base
|
|
8
8
|
# Create a new deployment object.
|
9
9
|
# ++hash++: Hash including all attributes.
|
10
10
|
# See https://mesosphere.github.io/marathon/docs/rest-api.html#get-/v2/deployments for full details.
|
11
|
-
def initialize(hash)
|
11
|
+
def initialize(hash, marathon_instance)
|
12
12
|
super(hash, ACCESSORS)
|
13
|
+
@marathon_instance = marathon_instance
|
13
14
|
@currentActions = (info[:currentActions] || []).map { |e| Marathon::DeploymentAction.new(e) }
|
14
15
|
@steps = (info[:steps] || []).map { |e| Marathon::DeploymentStep.new(e) }
|
15
16
|
end
|
@@ -19,7 +20,7 @@ class Marathon::Deployment < Marathon::Base
|
|
19
20
|
# is created to restore the previous configuration. If set to true, then the deployment
|
20
21
|
# is still canceled but no rollback deployment is created.
|
21
22
|
def delete(force = false)
|
22
|
-
|
23
|
+
@marathon_instance.deployments.delete(id, force)
|
23
24
|
end
|
24
25
|
alias :cancel :delete
|
25
26
|
|
@@ -50,13 +51,14 @@ end
|
|
50
51
|
|
51
52
|
# This class represents a set of Deployments
|
52
53
|
class Marathon::Deployments
|
53
|
-
def initialize(
|
54
|
-
@
|
54
|
+
def initialize(marathon_instance)
|
55
|
+
@marathon_instance = marathon_instance
|
56
|
+
@connection = @marathon_instance.connection
|
55
57
|
end
|
56
58
|
# List running deployments.
|
57
59
|
def list
|
58
60
|
json = @connection.get('/v2/deployments')
|
59
|
-
json.map { |j| Marathon::Deployment.new(j) }
|
61
|
+
json.map { |j| Marathon::Deployment.new(j, @marathon_instance) }
|
60
62
|
end
|
61
63
|
|
62
64
|
# Cancel the deployment with id.
|
@@ -68,7 +70,7 @@ class Marathon::Deployments
|
|
68
70
|
query = {}
|
69
71
|
query[:force] = true if force
|
70
72
|
json = @connection.delete("/v2/deployments/#{id}")
|
71
|
-
Marathon::DeploymentInfo.new(json)
|
73
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
72
74
|
end
|
73
75
|
|
74
76
|
end
|
@@ -6,9 +6,10 @@ class Marathon::DeploymentInfo < Marathon::Base
|
|
6
6
|
|
7
7
|
# Create a new deployment info object.
|
8
8
|
# ++hash++: Hash returned by API, including 'deploymentId' and 'version'
|
9
|
-
def initialize(hash)
|
9
|
+
def initialize(hash, marathon_instance)
|
10
10
|
super(hash, %w[deploymentId version])
|
11
11
|
raise Marathon::Error::ArgumentError, 'version must not be nil' unless version
|
12
|
+
@marathon_instance = marathon_instance
|
12
13
|
end
|
13
14
|
|
14
15
|
# Wait for a deployment to finish.
|
@@ -18,7 +19,7 @@ class Marathon::DeploymentInfo < Marathon::Base
|
|
18
19
|
deployments = nil
|
19
20
|
while deployments.nil? or deployments.select{|e| e.id == deploymentId}.size > 0 do
|
20
21
|
sleep(RECHECK_INTERVAL)
|
21
|
-
deployments =
|
22
|
+
deployments = @marathon_instance.deployments.list
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -2,8 +2,8 @@
|
|
2
2
|
# See https://mesosphere.github.io/marathon/docs/rest-api.html#event-subscriptions for full list of API's methods.
|
3
3
|
class Marathon::EventSubscriptions
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@connection = connection
|
5
|
+
def initialize(marathon_instance)
|
6
|
+
@connection = marathon_instance.connection
|
7
7
|
end
|
8
8
|
|
9
9
|
# List all event subscriber callback URLs.
|
data/lib/marathon/group.rb
CHANGED
@@ -5,7 +5,7 @@ class Marathon::Group < Marathon::Base
|
|
5
5
|
ACCESSORS = %w[ id dependencies version ]
|
6
6
|
|
7
7
|
DEFAULTS = {
|
8
|
-
|
8
|
+
:dependencies => []
|
9
9
|
}
|
10
10
|
|
11
11
|
attr_reader :apps, :groups
|
@@ -13,8 +13,9 @@ class Marathon::Group < Marathon::Base
|
|
13
13
|
# Create a new group object.
|
14
14
|
# ++hash++: Hash including all attributes.
|
15
15
|
# See https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/groups for full details.
|
16
|
-
def initialize(hash)
|
16
|
+
def initialize(hash, marathon_instance)
|
17
17
|
super(Marathon::Util.merge_keywordized_hash(DEFAULTS, hash), ACCESSORS)
|
18
|
+
@marathon_instance = marathon_instance
|
18
19
|
raise ArgumentError, 'Group must have an id' unless id
|
19
20
|
refresh_attributes
|
20
21
|
raise ArgumentError, 'Group can have either groups or apps, not both' \
|
@@ -23,7 +24,7 @@ class Marathon::Group < Marathon::Base
|
|
23
24
|
|
24
25
|
# Reload attributes from marathon API.
|
25
26
|
def refresh
|
26
|
-
new_app =
|
27
|
+
new_app = @marathon_instance.groups.get(id)
|
27
28
|
@info = new_app.info
|
28
29
|
refresh_attributes
|
29
30
|
end
|
@@ -34,7 +35,7 @@ class Marathon::Group < Marathon::Base
|
|
34
35
|
# this endpoint returns immediatly with a version. The failure or success of the action is signalled via event.
|
35
36
|
# There is a group_change_success and group_change_failed event with the given version.
|
36
37
|
def start!
|
37
|
-
|
38
|
+
@marathon_instance.groups.start(info)
|
38
39
|
end
|
39
40
|
|
40
41
|
# Change parameters of a deployed application group.
|
@@ -64,7 +65,7 @@ class Marathon::Group < Marathon::Base
|
|
64
65
|
else
|
65
66
|
new_hash = hash
|
66
67
|
end
|
67
|
-
|
68
|
+
@marathon_instance.groups.change(id, new_hash, force, dry_run)
|
68
69
|
end
|
69
70
|
|
70
71
|
# Create a new version with parameters of an old version.
|
@@ -84,8 +85,8 @@ class Marathon::Group < Marathon::Base
|
|
84
85
|
def to_pretty_s
|
85
86
|
%Q[
|
86
87
|
Group ID: #{id}
|
87
|
-
#{pretty_array(apps)}
|
88
|
-
#{pretty_array(groups)}
|
88
|
+
#{pretty_array(apps)}
|
89
|
+
#{pretty_array(groups)}
|
89
90
|
Version: #{version}
|
90
91
|
].gsub(/\n\n+/, "\n").strip
|
91
92
|
end
|
@@ -93,28 +94,25 @@ Version: #{version}
|
|
93
94
|
private
|
94
95
|
|
95
96
|
def pretty_array(array)
|
96
|
-
array.map { |e| e.to_pretty_s.split("\n").map { |e| " #{e}" }}.join("\n")
|
97
|
+
array.map { |e| e.to_pretty_s.split("\n").map { |e| " #{e}" } }.join("\n")
|
97
98
|
end
|
98
99
|
|
99
100
|
# Rebuild attribute classes
|
100
101
|
def refresh_attributes
|
101
|
-
@apps = (info[:apps] || []).map { |e| Marathon::App.new(e) }
|
102
|
-
@groups = (info[:groups] || []).map { |e| Marathon::Group.new(e) }
|
102
|
+
@apps = (info[:apps] || []).map { |e| Marathon::App.new(e, @marathon_instance) }
|
103
|
+
@groups = (info[:groups] || []).map { |e| Marathon::Group.new(e, @marathon_instance) }
|
103
104
|
end
|
104
105
|
|
105
106
|
class << self
|
106
|
-
|
107
107
|
# List the group with the specified ID.
|
108
108
|
# ++id++: Group's id.
|
109
109
|
def get(id)
|
110
|
-
|
111
|
-
new(json)
|
110
|
+
Marathon.singleton.groups.get(id)
|
112
111
|
end
|
113
112
|
|
114
113
|
# List all groups.
|
115
114
|
def list
|
116
|
-
|
117
|
-
new(json)
|
115
|
+
Marathon.singleton.groups.list
|
118
116
|
end
|
119
117
|
|
120
118
|
# Delete the application group with id.
|
@@ -122,11 +120,9 @@ Version: #{version}
|
|
122
120
|
# ++force++: If the group is affected by a running deployment, then the update operation will fail.
|
123
121
|
# The current deployment can be overridden by setting the `force` query parameter.
|
124
122
|
def delete(id, force = false)
|
125
|
-
|
126
|
-
query[:force] = true if force
|
127
|
-
json = Marathon.connection.delete("/v2/groups/#{id}", query)
|
128
|
-
Marathon::DeploymentInfo.new(json)
|
123
|
+
Marathon.singleton.groups.delete(id, force)
|
129
124
|
end
|
125
|
+
|
130
126
|
alias :remove :delete
|
131
127
|
|
132
128
|
# Create and start a new application group. Application groups can contain other application groups.
|
@@ -137,9 +133,9 @@ Version: #{version}
|
|
137
133
|
# ++hash++: Hash including all attributes
|
138
134
|
# see https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/groups for full details
|
139
135
|
def start(hash)
|
140
|
-
|
141
|
-
Marathon::DeploymentInfo.new(json)
|
136
|
+
Marathon.singleton.groups.start(hash)
|
142
137
|
end
|
138
|
+
|
143
139
|
alias :create :start
|
144
140
|
|
145
141
|
# Change parameters of a deployed application group.
|
@@ -164,15 +160,89 @@ Version: #{version}
|
|
164
160
|
# The current deployment can be overridden by setting the `force` query parameter.
|
165
161
|
# ++dry_run++: Get a preview of the deployment steps Marathon would run for a given group update.
|
166
162
|
def change(id, hash, force = false, dry_run = false)
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
163
|
+
Marathon.singleton.groups.change(id, hash, force, dry_run)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# This class represents a set of Groups
|
169
|
+
class Marathon::Groups < Marathon::Base
|
170
|
+
|
171
|
+
def initialize(marathon_instance)
|
172
|
+
@marathon_instance = marathon_instance
|
173
|
+
end
|
174
|
+
|
175
|
+
# List the group with the specified ID.
|
176
|
+
# ++id++: Group's id.
|
177
|
+
def get(id)
|
178
|
+
json = @marathon_instance.connection.get("/v2/groups/#{id}")
|
179
|
+
Marathon::Group.new(json, @marathon_instance)
|
180
|
+
end
|
181
|
+
|
182
|
+
# List all groups.
|
183
|
+
def list
|
184
|
+
json = @marathon_instance.connection.get('/v2/groups')
|
185
|
+
Marathon::Group.new(json, @marathon_instance)
|
186
|
+
end
|
187
|
+
|
188
|
+
# Delete the application group with id.
|
189
|
+
# ++id++: Group's id.
|
190
|
+
# ++force++: If the group is affected by a running deployment, then the update operation will fail.
|
191
|
+
# The current deployment can be overridden by setting the `force` query parameter.
|
192
|
+
def delete(id, force = false)
|
193
|
+
query = {}
|
194
|
+
query[:force] = true if force
|
195
|
+
json = @marathon_instance.connection.delete("/v2/groups/#{id}", query)
|
196
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
197
|
+
end
|
198
|
+
|
199
|
+
alias :remove :delete
|
200
|
+
|
201
|
+
# Create and start a new application group. Application groups can contain other application groups.
|
202
|
+
# An application group can either hold other groups or applications, but can not be mixed in one.
|
203
|
+
# Since the deployment of the group can take a considerable amount of time,
|
204
|
+
# this endpoint returns immediatly with a version. The failure or success of the action is signalled via event.
|
205
|
+
# There is a group_change_success and group_change_failed event with the given version.
|
206
|
+
# ++hash++: Hash including all attributes
|
207
|
+
# see https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/groups for full details
|
208
|
+
def start(hash)
|
209
|
+
json = @marathon_instance.connection.post('/v2/groups', nil, :body => hash)
|
210
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
211
|
+
end
|
212
|
+
|
213
|
+
alias :create :start
|
214
|
+
|
215
|
+
# Change parameters of a deployed application group.
|
216
|
+
# Changes to application parameters will result in a restart of this application.
|
217
|
+
# A new application added to the group is started.
|
218
|
+
# An existing application removed from the group gets stopped.
|
219
|
+
# If there are no changes to the application definition, no restart is triggered.
|
220
|
+
# During restart marathon keeps track, that the configured amount of minimal running instances are always available.
|
221
|
+
# A deployment can run forever. This is the case,
|
222
|
+
# when the new application has a problem and does not become healthy.
|
223
|
+
# In this case, human interaction is needed with 2 possible choices:
|
224
|
+
# Rollback to an existing older version (send an existing version in the body)
|
225
|
+
# Update with a newer version of the group which does not have the problems of the old one.
|
226
|
+
# If there is an upgrade process already in progress, a new update will be rejected unless the force flag is set.
|
227
|
+
# With the force flag given, a running upgrade is terminated and a new one is started.
|
228
|
+
# Since the deployment of the group can take a considerable amount of time,
|
229
|
+
# this endpoint returns immediatly with a version. The failure or success of the action is signalled via event.
|
230
|
+
# There is a group_change_success and group_change_failed event with the given version.
|
231
|
+
# ++id++: Group's id.
|
232
|
+
# ++hash++: Hash of attributes to change.
|
233
|
+
# ++force++: If the group is affected by a running deployment, then the update operation will fail.
|
234
|
+
# The current deployment can be overridden by setting the `force` query parameter.
|
235
|
+
# ++dry_run++: Get a preview of the deployment steps Marathon would run for a given group update.
|
236
|
+
def change(id, hash, force = false, dry_run = false)
|
237
|
+
query = {}
|
238
|
+
query[:force] = true if force
|
239
|
+
query[:dryRun] = true if dry_run
|
240
|
+
json = @marathon_instance.connection.put("/v2/groups/#{id}", query, :body => hash)
|
241
|
+
if dry_run
|
242
|
+
json['steps'].map { |e| Marathon::DeploymentStep.new(e) }
|
243
|
+
else
|
244
|
+
Marathon::DeploymentInfo.new(json, @marathon_instance)
|
176
245
|
end
|
177
246
|
end
|
178
247
|
end
|
248
|
+
|
data/lib/marathon/leader.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
# See https://mesosphere.github.io/marathon/docs/rest-api.html#get-/v2/leader for full list of API's methods.
|
3
3
|
class Marathon::Leader
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@connection = connection
|
5
|
+
def initialize(marathon_instance)
|
6
|
+
@connection = marathon_instance.connection
|
7
7
|
end
|
8
8
|
|
9
9
|
# Returns the current leader. If no leader exists, raises NotFoundError.
|
data/lib/marathon/queue.rb
CHANGED
@@ -6,9 +6,10 @@ class Marathon::Queue < Marathon::Base
|
|
6
6
|
|
7
7
|
# Create a new queue element object.
|
8
8
|
# ++hash++: Hash returned by API, including 'app' and 'delay'
|
9
|
-
def initialize(hash)
|
9
|
+
def initialize(hash, marathon_instance)
|
10
10
|
super(hash, %w[delay])
|
11
|
-
@app = Marathon::App.new(info[:app], true)
|
11
|
+
@app = Marathon::App.new(info[:app], marathon_instance, true)
|
12
|
+
@marathon_instance = marathon_instance
|
12
13
|
end
|
13
14
|
|
14
15
|
def to_s
|
@@ -27,8 +28,8 @@ end
|
|
27
28
|
|
28
29
|
# This class represents the Queue with all its elements
|
29
30
|
class Marathon::Queues
|
30
|
-
def initialize(
|
31
|
-
@connection = connection
|
31
|
+
def initialize(marathon_instance)
|
32
|
+
@connection = marathon_instance.connection
|
32
33
|
end
|
33
34
|
|
34
35
|
# Show content of the task queue.
|
data/lib/marathon/task.rb
CHANGED
@@ -6,8 +6,9 @@ class Marathon::Task < Marathon::Base
|
|
6
6
|
|
7
7
|
# Create a new task object.
|
8
8
|
# ++hash++: Hash including all attributes
|
9
|
-
def initialize(hash)
|
9
|
+
def initialize(hash, marathon_instance)
|
10
10
|
super(hash, ACCESSORS)
|
11
|
+
@marathon_instance = marathon_instance
|
11
12
|
end
|
12
13
|
|
13
14
|
# Kill the task that belongs to an application.
|
@@ -75,8 +76,9 @@ end
|
|
75
76
|
|
76
77
|
# This class represents a set of Tasks
|
77
78
|
class Marathon::Tasks
|
78
|
-
def initialize(
|
79
|
-
@
|
79
|
+
def initialize(marathon_instance)
|
80
|
+
@marathon_instance = marathon_instance
|
81
|
+
@connection = marathon_instance.connection
|
80
82
|
end
|
81
83
|
|
82
84
|
# List tasks of all applications.
|
@@ -86,14 +88,14 @@ class Marathon::Tasks
|
|
86
88
|
query = {}
|
87
89
|
Marathon::Util.add_choice(query, :status, status, %w[running staging])
|
88
90
|
json = @connection.get('/v2/tasks', query)['tasks']
|
89
|
-
json.map { |j| Marathon::Task.new(j) }
|
91
|
+
json.map { |j| Marathon::Task.new(j, @marathon_instance) }
|
90
92
|
end
|
91
93
|
|
92
94
|
# List all running tasks for application appId.
|
93
95
|
# ++appId++: Application's id
|
94
96
|
def get(appId)
|
95
97
|
json = @connection.get("/v2/apps/#{appId}/tasks")['tasks']
|
96
|
-
json.map { |j| Marathon::Task.new(j) }
|
98
|
+
json.map { |j| Marathon::Task.new(j, @marathon_instance) }
|
97
99
|
end
|
98
100
|
|
99
101
|
# Kill the given list of tasks and scale apps if requested.
|
@@ -117,7 +119,7 @@ class Marathon::Tasks
|
|
117
119
|
query[:host] = host if host
|
118
120
|
query[:scale] = true if scale
|
119
121
|
json = @connection.delete("/v2/apps/#{appId}/tasks", query)['tasks']
|
120
|
-
json.map { |j| Marathon::Task.new(j) }
|
122
|
+
json.map { |j| Marathon::Task.new(j, @marathon_instance) }
|
121
123
|
end
|
122
124
|
|
123
125
|
end
|
data/lib/marathon/version.rb
CHANGED
data/spec/marathon/app_spec.rb
CHANGED
@@ -15,7 +15,7 @@ describe Marathon::App do
|
|
15
15
|
'uris' => ['http://example.com/big.tar'],
|
16
16
|
'labels' => {'abc'=>'123'},
|
17
17
|
'version' => 'foo-version'
|
18
|
-
}) }
|
18
|
+
}, double(Marathon::MarathonInstance)) }
|
19
19
|
|
20
20
|
let(:expected_string) do
|
21
21
|
"Marathon::App { :id => /app/foo }"
|
@@ -40,7 +40,7 @@ describe Marathon::App do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe '#to_json' do
|
43
|
-
subject { described_class.new({ 'id' => '/app/foo' }) }
|
43
|
+
subject { described_class.new({ 'id' => '/app/foo' }, double(Marathon::MarathonInstance)) }
|
44
44
|
|
45
45
|
let(:expected_string) do
|
46
46
|
'{"env":{},"labels":{},"ports":[],"uris":[],"id":"/app/foo"}'
|
@@ -50,7 +50,7 @@ describe Marathon::App do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
describe '#check_read_only' do
|
53
|
-
subject { described_class.new({ 'id' => '/ubuntu2' }, true) }
|
53
|
+
subject { described_class.new({ 'id' => '/ubuntu2' }, double(Marathon::MarathonInstance), true) }
|
54
54
|
|
55
55
|
it 'does not allow changing the app' do
|
56
56
|
expect { subject.change!({}) }.to raise_error(Marathon::Error::ArgumentError)
|
@@ -60,7 +60,7 @@ describe Marathon::App do
|
|
60
60
|
describe '#container' do
|
61
61
|
subject { described_class.new({
|
62
62
|
'id' => '/ubuntu2', 'container' => {'type'=>'DOCKER', 'docker'=>{'image'=>'felixb/yocto-httpd'}}
|
63
|
-
})}
|
63
|
+
}, double(Marathon::MarathonInstance))}
|
64
64
|
|
65
65
|
it 'has container' do
|
66
66
|
expect(subject.container).to be_instance_of(Marathon::Container)
|
@@ -69,7 +69,8 @@ describe Marathon::App do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
describe '#constraints' do
|
72
|
-
subject { described_class.new({ 'id' => '/ubuntu2', 'constraints' => [['hostname', 'UNIQUE']] }
|
72
|
+
subject { described_class.new({ 'id' => '/ubuntu2', 'constraints' => [['hostname', 'UNIQUE']] },
|
73
|
+
double(Marathon::MarathonInstance)) }
|
73
74
|
|
74
75
|
it 'has constraints' do
|
75
76
|
expect(subject.constraints).to be_instance_of(Array)
|
@@ -79,7 +80,8 @@ describe Marathon::App do
|
|
79
80
|
|
80
81
|
describe '#labels' do
|
81
82
|
describe 'w/ lables' do
|
82
|
-
subject { described_class.new({'id' => '/ubuntu2', 'labels' => {'env' => 'abc', 'xyz' => '123'}}
|
83
|
+
subject { described_class.new({'id' => '/ubuntu2', 'labels' => {'env' => 'abc', 'xyz' => '123'}},
|
84
|
+
double(Marathon::MarathonInstance)) }
|
83
85
|
it 'has keywordized labels' do
|
84
86
|
expect(subject.labels).to be_instance_of(Hash)
|
85
87
|
expect(subject.labels).to have_key(:env)
|
@@ -89,7 +91,7 @@ describe Marathon::App do
|
|
89
91
|
end
|
90
92
|
|
91
93
|
describe 'w/o labels' do
|
92
|
-
subject { described_class.new({'id' => '/ubuntu2'}) }
|
94
|
+
subject { described_class.new({'id' => '/ubuntu2'}, double(Marathon::MarathonInstance)) }
|
93
95
|
it 'has empty labels' do
|
94
96
|
expect(subject.labels).to eq({})
|
95
97
|
end
|
@@ -97,7 +99,8 @@ describe Marathon::App do
|
|
97
99
|
end
|
98
100
|
|
99
101
|
describe '#constraints' do
|
100
|
-
subject { described_class.new({ 'id' => '/ubuntu2', 'healthChecks' => [{ 'path' => '/ping' }] }
|
102
|
+
subject { described_class.new({ 'id' => '/ubuntu2', 'healthChecks' => [{ 'path' => '/ping' }] },
|
103
|
+
double(Marathon::MarathonInstance)) }
|
101
104
|
|
102
105
|
it 'has healthChecks' do
|
103
106
|
expect(subject.healthChecks).to be_instance_of(Array)
|
@@ -106,7 +109,7 @@ describe Marathon::App do
|
|
106
109
|
end
|
107
110
|
|
108
111
|
describe '#tasks' do
|
109
|
-
subject { described_class.new({ 'id' => '/ubuntu2' }) }
|
112
|
+
subject { described_class.new({ 'id' => '/ubuntu2' }, double(Marathon::MarathonInstance)) }
|
110
113
|
|
111
114
|
it 'shows already loaded tasks w/o API call' do
|
112
115
|
subject.info[:tasks] = []
|
@@ -116,164 +119,199 @@ describe Marathon::App do
|
|
116
119
|
end
|
117
120
|
|
118
121
|
describe '#versions' do
|
119
|
-
|
122
|
+
before(:each) do
|
123
|
+
@apps = double(Marathon::Apps)
|
124
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
125
|
+
@subject = described_class.new({'id' => '/ubuntu2'}, @marathon_instance)
|
126
|
+
end
|
120
127
|
|
121
128
|
it 'loads versions from API' do
|
122
|
-
expect(
|
123
|
-
expect(subject.versions).to eq(['foo-version'])
|
129
|
+
expect(@apps).to receive(:versions).with('/ubuntu2') { ['foo-version'] }
|
130
|
+
expect(@subject.versions).to eq(['foo-version'])
|
124
131
|
end
|
125
132
|
|
126
133
|
it 'loads version from API' do
|
127
|
-
expect(
|
134
|
+
expect(@apps).to receive(:version).with('/ubuntu2', 'foo-version') {
|
128
135
|
Marathon::App.new({'id' => '/ubuntu2', 'version' => 'foo-version'}, true)
|
129
136
|
}
|
130
|
-
expect(subject.versions('foo-version').version).to eq('foo-version')
|
137
|
+
expect(@subject.versions('foo-version').version).to eq('foo-version')
|
131
138
|
end
|
132
139
|
end
|
133
140
|
|
134
141
|
describe '#start!' do
|
135
|
-
|
142
|
+
before(:each) do
|
143
|
+
@apps = double(Marathon::Apps)
|
144
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
145
|
+
@subject = described_class.new({ 'id' => '/app/foo' }, @marathon_instance)
|
146
|
+
end
|
136
147
|
|
137
148
|
it 'checks for read only' do
|
138
|
-
expect(subject).to receive(:check_read_only)
|
139
|
-
expect(
|
149
|
+
expect(@subject).to receive(:check_read_only)
|
150
|
+
expect(@apps).to receive(:change).with(
|
140
151
|
'/app/foo',
|
141
152
|
{:env=>{}, :labels=>{}, :ports=>[], :uris=>[], :id=>"/app/foo"},
|
142
153
|
false
|
143
154
|
)
|
144
|
-
subject.start!
|
155
|
+
@subject.start!
|
145
156
|
end
|
146
157
|
|
147
158
|
it 'starts the app' do
|
148
|
-
expect(
|
159
|
+
expect(@apps).to receive(:change)
|
149
160
|
.with(
|
150
161
|
'/app/foo',
|
151
162
|
{:env=>{}, :labels=>{}, :ports=>[], :uris=>[], :id=>"/app/foo"},
|
152
163
|
false
|
153
164
|
)
|
154
|
-
subject.start!
|
165
|
+
@subject.start!
|
155
166
|
end
|
156
167
|
end
|
157
168
|
|
158
169
|
describe '#refresh' do
|
159
|
-
|
170
|
+
before(:each) do
|
171
|
+
@apps = double(Marathon::Apps)
|
172
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
173
|
+
@subject = described_class.new({ 'id' => '/app/foo' }, @marathon_instance)
|
174
|
+
end
|
160
175
|
|
161
176
|
it 'checks for read only' do
|
162
|
-
expect(subject).to receive(:check_read_only)
|
163
|
-
expect(
|
164
|
-
subject.refresh
|
177
|
+
expect(@subject).to receive(:check_read_only)
|
178
|
+
expect(@apps).to receive(:get) { described_class.new({'id' => @subject.id}, double(Marathon::MarathonInstance)) }
|
179
|
+
@subject.refresh
|
165
180
|
end
|
166
181
|
|
167
182
|
it 'refreshs the app' do
|
168
|
-
expect(
|
169
|
-
described_class.new({ 'id' => '/app/foo', 'refreshed' => true })
|
183
|
+
expect(@apps).to receive(:get).with('/app/foo') do
|
184
|
+
described_class.new({ 'id' => '/app/foo', 'refreshed' => true }, double(Marathon::MarathonInstance))
|
170
185
|
end
|
171
|
-
subject.refresh
|
172
|
-
expect(subject.info[:refreshed]).to be(true)
|
186
|
+
@subject.refresh
|
187
|
+
expect(@subject.info[:refreshed]).to be(true)
|
173
188
|
end
|
174
189
|
|
175
190
|
it 'returns the app' do
|
176
|
-
expect(
|
177
|
-
described_class.new({ 'id' => '/app/foo' })
|
191
|
+
expect(@apps).to receive(:get).with('/app/foo') do
|
192
|
+
described_class.new({ 'id' => '/app/foo' }, double(Marathon::MarathonInstance))
|
178
193
|
end
|
179
|
-
expect(subject.refresh).to be subject
|
194
|
+
expect(@subject.refresh).to be @subject
|
180
195
|
end
|
181
196
|
end
|
182
197
|
|
183
198
|
describe '#restart!' do
|
184
|
-
|
199
|
+
before(:each) do
|
200
|
+
@apps = double(Marathon::Apps)
|
201
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
202
|
+
@subject = described_class.new({'id' => '/app/foo'}, @marathon_instance)
|
203
|
+
end
|
204
|
+
|
185
205
|
|
186
206
|
it 'checks for read only' do
|
187
|
-
expect(subject).to receive(:check_read_only)
|
188
|
-
expect(
|
189
|
-
subject.restart!
|
207
|
+
expect(@subject).to receive(:check_read_only)
|
208
|
+
expect(@apps).to receive(:restart)
|
209
|
+
@subject.restart!
|
190
210
|
end
|
191
211
|
|
192
212
|
it 'restarts the app' do
|
193
|
-
expect(
|
213
|
+
expect(@apps).to receive(:restart)
|
194
214
|
.with('/app/foo', false)
|
195
|
-
subject.restart!
|
215
|
+
@subject.restart!
|
196
216
|
end
|
197
217
|
|
198
218
|
it 'restarts the app, force' do
|
199
|
-
expect(
|
219
|
+
expect(@apps).to receive(:restart)
|
200
220
|
.with('/app/foo', true)
|
201
|
-
subject.restart!(true)
|
221
|
+
@subject.restart!(true)
|
202
222
|
end
|
203
223
|
end
|
204
224
|
|
205
225
|
describe '#change!' do
|
206
|
-
|
226
|
+
before(:each) do
|
227
|
+
@apps = double(Marathon::Apps)
|
228
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
229
|
+
@subject = described_class.new({'id' => '/app/foo'}, @marathon_instance)
|
230
|
+
end
|
207
231
|
|
208
232
|
it 'checks for read only' do
|
209
|
-
expect(subject).to receive(:check_read_only)
|
210
|
-
expect(
|
211
|
-
subject.change!({})
|
233
|
+
expect(@subject).to receive(:check_read_only)
|
234
|
+
expect(@apps).to receive(:change)
|
235
|
+
@subject.change!({})
|
212
236
|
end
|
213
237
|
|
214
238
|
it 'changes the app' do
|
215
|
-
expect(
|
216
|
-
subject.change!('instances' => 9000, 'version' => 'old-version')
|
239
|
+
expect(@apps).to receive(:change).with('/app/foo', {:instances => 9000 }, false)
|
240
|
+
@subject.change!('instances' => 9000, 'version' => 'old-version')
|
217
241
|
end
|
218
242
|
end
|
219
243
|
|
220
244
|
describe '#roll_back!' do
|
221
|
-
|
245
|
+
before(:each) do
|
246
|
+
@apps = double(Marathon::Apps)
|
247
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
248
|
+
@subject = described_class.new({:id => '/app/foo', :instances => 10}, @marathon_instance)
|
249
|
+
end
|
250
|
+
|
222
251
|
|
223
252
|
it 'checks for read only' do
|
224
|
-
expect(subject).to receive(:check_read_only)
|
225
|
-
expect(
|
226
|
-
subject.roll_back!('old_version')
|
253
|
+
expect(@subject).to receive(:check_read_only)
|
254
|
+
expect(@apps).to receive(:change)
|
255
|
+
@subject.roll_back!('old_version')
|
227
256
|
end
|
228
257
|
|
229
258
|
it 'changes the app' do
|
230
|
-
expect(subject).to receive(:change!).with({:version => 'old_version' }, false)
|
231
|
-
subject.roll_back!('old_version')
|
259
|
+
expect(@subject).to receive(:change!).with({:version => 'old_version' }, false)
|
260
|
+
@subject.roll_back!('old_version')
|
232
261
|
end
|
233
262
|
|
234
263
|
it 'changes the app with force' do
|
235
|
-
expect(subject).to receive(:change!).with({:version => 'old_version' }, true)
|
236
|
-
subject.roll_back!('old_version', true)
|
264
|
+
expect(@subject).to receive(:change!).with({:version => 'old_version' }, true)
|
265
|
+
@subject.roll_back!('old_version', true)
|
237
266
|
end
|
238
267
|
end
|
239
268
|
|
240
269
|
describe '#scale!' do
|
241
|
-
|
270
|
+
before(:each) do
|
271
|
+
@apps = double(Marathon::Apps)
|
272
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
273
|
+
@subject = described_class.new({:id => '/app/foo', :instances => 10}, @marathon_instance)
|
274
|
+
end
|
275
|
+
|
242
276
|
|
243
277
|
it 'checks for read only' do
|
244
|
-
expect(subject).to receive(:check_read_only)
|
245
|
-
expect(
|
246
|
-
subject.scale!(5)
|
278
|
+
expect(@subject).to receive(:check_read_only)
|
279
|
+
expect(@apps).to receive(:change)
|
280
|
+
@subject.scale!(5)
|
247
281
|
end
|
248
282
|
|
249
283
|
it 'changes the app' do
|
250
|
-
expect(subject).to receive(:change!).with({:instances => 9000}, false)
|
251
|
-
subject.scale!(9000)
|
284
|
+
expect(@subject).to receive(:change!).with({:instances => 9000}, false)
|
285
|
+
@subject.scale!(9000)
|
252
286
|
end
|
253
287
|
|
254
288
|
it 'changes the app with force' do
|
255
|
-
expect(subject).to receive(:change!).with({:instances => 9000}, true)
|
256
|
-
subject.scale!(9000, true)
|
289
|
+
expect(@subject).to receive(:change!).with({:instances => 9000}, true)
|
290
|
+
@subject.scale!(9000, true)
|
257
291
|
end
|
258
292
|
end
|
259
293
|
|
260
294
|
describe '#suspend!' do
|
261
|
-
|
295
|
+
before(:each) do
|
296
|
+
@apps = double(Marathon::Apps)
|
297
|
+
@marathon_instance = double(Marathon::MarathonInstance, :apps => @apps)
|
298
|
+
@subject = described_class.new({:id => '/app/foo', :instances => 10}, @marathon_instance)
|
299
|
+
end
|
262
300
|
|
263
301
|
it 'checks for read only' do
|
264
|
-
expect(subject).to receive(:check_read_only)
|
265
|
-
expect(
|
266
|
-
subject.suspend!
|
302
|
+
expect(@subject).to receive(:check_read_only)
|
303
|
+
expect(@apps).to receive(:change)
|
304
|
+
@subject.suspend!
|
267
305
|
end
|
268
306
|
|
269
307
|
it 'scales the app to 0' do
|
270
|
-
expect(subject).to receive(:scale!).with(0, false)
|
271
|
-
subject.suspend!
|
308
|
+
expect(@subject).to receive(:scale!).with(0, false)
|
309
|
+
@subject.suspend!
|
272
310
|
end
|
273
311
|
|
274
312
|
it 'scales the app to 0 with force' do
|
275
|
-
expect(subject).to receive(:scale!).with(0, true)
|
276
|
-
subject.suspend!(true)
|
313
|
+
expect(@subject).to receive(:scale!).with(0, true)
|
314
|
+
@subject.suspend!(true)
|
277
315
|
end
|
278
316
|
end
|
279
317
|
|
@@ -8,23 +8,27 @@ DEPLOYMENT_INFO_EXAMPLE = {
|
|
8
8
|
describe Marathon::DeploymentInfo do
|
9
9
|
|
10
10
|
describe '#attributes' do
|
11
|
-
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE) }
|
11
|
+
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE, double(Marathon::MarathonInstance)) }
|
12
12
|
|
13
13
|
its(:deploymentId) { should == 'deployment-123' }
|
14
14
|
its(:version) { should == 'version-456' }
|
15
15
|
end
|
16
16
|
|
17
17
|
describe '#wait' do
|
18
|
-
|
18
|
+
before(:each) do
|
19
|
+
@deployments = double(Marathon::Deployments)
|
20
|
+
@subject = described_class.new(DEPLOYMENT_INFO_EXAMPLE,
|
21
|
+
double(Marathon::MarathonInstance, :deployments => @deployments))
|
22
|
+
end
|
19
23
|
|
20
24
|
it 'waits for the deployment' do
|
21
|
-
expect(
|
22
|
-
subject.wait
|
25
|
+
expect(@deployments).to receive(:list) { [] }
|
26
|
+
@subject.wait
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
26
30
|
describe '#to_s' do
|
27
|
-
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE) }
|
31
|
+
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE, double(Marathon::MarathonInstance)) }
|
28
32
|
|
29
33
|
let(:expected_string) do
|
30
34
|
'Marathon::DeploymentInfo { :version => version-456 :deploymentId => deployment-123 }'
|
@@ -34,7 +38,7 @@ describe Marathon::DeploymentInfo do
|
|
34
38
|
end
|
35
39
|
|
36
40
|
describe '#to_s w/o deploymentId' do
|
37
|
-
subject { described_class.new(:version => 'foo-version') }
|
41
|
+
subject { described_class.new({:version => 'foo-version'}, double(Marathon::MarathonInstance)) }
|
38
42
|
|
39
43
|
let(:expected_string) do
|
40
44
|
'Marathon::DeploymentInfo { :version => foo-version }'
|
@@ -44,7 +48,7 @@ describe Marathon::DeploymentInfo do
|
|
44
48
|
end
|
45
49
|
|
46
50
|
describe '#to_json' do
|
47
|
-
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE) }
|
51
|
+
subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE, double(Marathon::MarathonInstance)) }
|
48
52
|
|
49
53
|
its(:to_json) { should == DEPLOYMENT_INFO_EXAMPLE.to_json }
|
50
54
|
end
|
@@ -25,7 +25,7 @@ DEPLOYMENT_EXAMPLE = {
|
|
25
25
|
describe Marathon::Deployment do
|
26
26
|
|
27
27
|
describe '#to_s' do
|
28
|
-
subject { described_class.new(DEPLOYMENT_EXAMPLE) }
|
28
|
+
subject { described_class.new(DEPLOYMENT_EXAMPLE, double(Marathon::MarathonInstance)) }
|
29
29
|
|
30
30
|
let(:expected_string) do
|
31
31
|
'Marathon::Deployment { ' \
|
@@ -36,13 +36,13 @@ describe Marathon::Deployment do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
describe '#to_json' do
|
39
|
-
subject { described_class.new(DEPLOYMENT_EXAMPLE) }
|
39
|
+
subject { described_class.new(DEPLOYMENT_EXAMPLE, double(Marathon::MarathonInstance)) }
|
40
40
|
|
41
41
|
its(:to_json) { should == DEPLOYMENT_EXAMPLE.to_json }
|
42
42
|
end
|
43
43
|
|
44
44
|
describe 'attributes' do
|
45
|
-
subject { described_class.new(DEPLOYMENT_EXAMPLE) }
|
45
|
+
subject { described_class.new(DEPLOYMENT_EXAMPLE, double(Marathon::MarathonInstance)) }
|
46
46
|
|
47
47
|
its(:id) { should == DEPLOYMENT_EXAMPLE[:id] }
|
48
48
|
its(:affectedApps) { should == DEPLOYMENT_EXAMPLE[:affectedApps] }
|
@@ -52,16 +52,20 @@ describe Marathon::Deployment do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
describe '#delete' do
|
55
|
-
|
55
|
+
before(:each) do
|
56
|
+
@deployments = double(Marathon::Deployments)
|
57
|
+
@subject = described_class.new(DEPLOYMENT_EXAMPLE,
|
58
|
+
double(Marathon::MarathonInstance, :deployments => @deployments))
|
59
|
+
end
|
56
60
|
|
57
61
|
it 'deletes the deployment' do
|
58
|
-
expect(
|
59
|
-
subject.delete
|
62
|
+
expect(@deployments).to receive(:delete).with(DEPLOYMENT_EXAMPLE[:id], false)
|
63
|
+
@subject.delete
|
60
64
|
end
|
61
65
|
|
62
66
|
it 'force deletes the deployment' do
|
63
|
-
expect(
|
64
|
-
subject.delete(true)
|
67
|
+
expect(@deployments).to receive(:delete).with(DEPLOYMENT_EXAMPLE[:id], true)
|
68
|
+
@subject.delete(true)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
data/spec/marathon/group_spec.rb
CHANGED
@@ -33,10 +33,9 @@ EXAMPLE_GROUP = {
|
|
33
33
|
describe Marathon::Group do
|
34
34
|
|
35
35
|
describe '#init' do
|
36
|
-
subject { described_class }
|
37
|
-
|
38
36
|
it 'fails with group + apps' do
|
39
|
-
expect{
|
37
|
+
expect{described_class.new({:apps => [{:id => 'app'}], :groups => [{:id => 'group'}], :id => '/foo'},
|
38
|
+
double(Marathon::MarathonInstance))}
|
40
39
|
.to raise_error(Marathon::Error::ArgumentError, /Group can have either/)
|
41
40
|
end
|
42
41
|
end
|
@@ -60,50 +59,63 @@ describe Marathon::Group do
|
|
60
59
|
|
61
60
|
end
|
62
61
|
|
63
|
-
its(:to_s) { should == expected_string }
|
64
|
-
its(:to_pretty_s) { should == expected_pretty_string }
|
62
|
+
# its(:to_s) { should == expected_string }
|
63
|
+
# its(:to_pretty_s) { should == expected_pretty_string }
|
65
64
|
end
|
66
65
|
|
67
66
|
describe '#start!' do
|
68
|
-
|
67
|
+
before(:each) do
|
68
|
+
@groups = double(Marathon::Groups)
|
69
|
+
@marathon_instance = double(Marathon::MarathonInstance, :groups => @groups)
|
70
|
+
@subject = described_class.new({'id' => '/group/foo'}, @marathon_instance)
|
71
|
+
end
|
69
72
|
|
70
73
|
it 'starts the group' do
|
71
|
-
expect(
|
74
|
+
expect(@groups).to receive(:start)
|
72
75
|
.with({:dependencies=>[], :id=>'/group/foo'}) do
|
73
|
-
Marathon::DeploymentInfo.new({ 'version' => 'new-version' })
|
76
|
+
Marathon::DeploymentInfo.new({ 'version' => 'new-version' }, @marathon_instance)
|
74
77
|
end
|
75
|
-
expect(subject.start!.version).to eq('new-version')
|
78
|
+
expect(@subject.start!.version).to eq('new-version')
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
79
82
|
describe '#refresh' do
|
80
|
-
|
83
|
+
before(:each) do
|
81
84
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
+
@groups = double(Marathon::Groups)
|
86
|
+
@marathon_instance = double(Marathon::MarathonInstance, :groups => @groups)
|
87
|
+
@subject = described_class.new({ 'id' => '/app/foo' }, @marathon_instance)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'refreshes the group' do
|
91
|
+
expect(@groups).to receive(:get).with('/app/foo') do
|
92
|
+
described_class.new({ 'id' => '/app/foo', 'refreshed' => true }, @marathon_instance)
|
85
93
|
end
|
86
|
-
subject.refresh
|
87
|
-
expect(subject.info[:refreshed]).to be(true)
|
94
|
+
@subject.refresh
|
95
|
+
expect(@subject.info[:refreshed]).to be(true)
|
88
96
|
end
|
89
97
|
end
|
90
98
|
|
91
99
|
describe '#change!' do
|
92
|
-
|
100
|
+
before(:each) do
|
101
|
+
@groups = double(Marathon::Groups)
|
102
|
+
@marathon_instance = double(Marathon::MarathonInstance, :groups => @groups)
|
103
|
+
@subject = described_class.new({'id' => '/app/foo'}, @marathon_instance)
|
104
|
+
end
|
93
105
|
|
94
106
|
it 'changes the group' do
|
95
|
-
expect(
|
96
|
-
subject.change!('instances' => 9000)
|
107
|
+
expect(@groups).to receive(:change).with('/app/foo', {:instances => 9000 }, false, false)
|
108
|
+
@subject.change!('instances' => 9000)
|
97
109
|
end
|
98
110
|
|
99
111
|
it 'changes the group and strips :version' do
|
100
|
-
expect(
|
101
|
-
subject.change!('instances' => 9000, :version => 'old-version')
|
112
|
+
expect(@groups).to receive(:change).with('/app/foo', {:instances => 9000 }, false, false)
|
113
|
+
@subject.change!('instances' => 9000, :version => 'old-version')
|
102
114
|
end
|
103
115
|
end
|
104
116
|
|
105
117
|
describe '#roll_back!' do
|
106
|
-
subject { described_class.new({ 'id' => '/app/foo', 'instances' => 10 }) }
|
118
|
+
subject { described_class.new({ 'id' => '/app/foo', 'instances' => 10 }, double(Marathon::MarathonInstance)) }
|
107
119
|
|
108
120
|
it 'changes the group' do
|
109
121
|
expect(subject).to receive(:change!).with({'version' => 'old_version' }, false)
|
@@ -144,7 +156,7 @@ describe Marathon::Group do
|
|
144
156
|
describe '.get' do
|
145
157
|
subject { described_class }
|
146
158
|
|
147
|
-
|
159
|
+
it 'gets the group', :vcr do
|
148
160
|
group = subject.get('/test-group')
|
149
161
|
expect(group).to be_instance_of(described_class)
|
150
162
|
expect(group.id).to eq('/test-group')
|
data/spec/marathon/queue_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Marathon::Queue do
|
|
6
6
|
subject { described_class.new({
|
7
7
|
'app' => { 'id' => '/app/foo' },
|
8
8
|
'delay' => { 'overdue' => true }
|
9
|
-
|
9
|
+
}, double(Marathon::MarathonInstance)) }
|
10
10
|
|
11
11
|
it 'has app' do
|
12
12
|
expect(subject.app).to be_instance_of(Marathon::App)
|
@@ -27,7 +27,7 @@ describe Marathon::Queue do
|
|
27
27
|
subject { described_class.new({
|
28
28
|
'app' => { 'id' => '/app/foo' },
|
29
29
|
'delay' => { 'overdue' => true }
|
30
|
-
}) }
|
30
|
+
}, double(Marathon::MarathonInstance)) }
|
31
31
|
|
32
32
|
let(:expected_string) do
|
33
33
|
'Marathon::Queue { :appId => /app/foo :delay => {:overdue=>true} }'
|
@@ -40,7 +40,7 @@ describe Marathon::Queue do
|
|
40
40
|
subject { described_class.new({
|
41
41
|
'app' => { 'id' => '/app/foo' },
|
42
42
|
'delay' => { 'overdue' => true }
|
43
|
-
}) }
|
43
|
+
}, double(Marathon::MarathonInstance)) }
|
44
44
|
|
45
45
|
let(:expected_string) do
|
46
46
|
'{"app":{"id":"/app/foo"},"delay":{"overdue":true}}'
|
data/spec/marathon/task_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe Marathon::Task do
|
|
9
9
|
'host' => 'foo-host',
|
10
10
|
'ports' => [31000, 31001],
|
11
11
|
'version' => 'foo-version'
|
12
|
-
}) }
|
12
|
+
}, double(Marathon::MarathonInstance)) }
|
13
13
|
|
14
14
|
let(:expected_string) do
|
15
15
|
"Marathon::Task { :id => task-id-foo :appId => /app/foo :host => foo-host }"
|
@@ -34,7 +34,7 @@ describe Marathon::Task do
|
|
34
34
|
'id' => 'task-id-foo',
|
35
35
|
'appId' => '/app/foo',
|
36
36
|
'host' => 'foo-host',
|
37
|
-
}) }
|
37
|
+
}, double(Marathon::MarathonInstance)) }
|
38
38
|
|
39
39
|
let(:expected_string) do
|
40
40
|
'{"id":"task-id-foo","appId":"/app/foo","host":"foo-host"}'
|
@@ -46,7 +46,7 @@ describe Marathon::Task do
|
|
46
46
|
describe '#delete!' do
|
47
47
|
let(:task) { described_class.new({
|
48
48
|
'id' => 'task_123', 'appId' => '/app/foo'
|
49
|
-
}) }
|
49
|
+
}, double(Marathon::MarathonInstance)) }
|
50
50
|
|
51
51
|
it 'deletes the task' do
|
52
52
|
expect(described_class).to receive(:delete).with('task_123', false)
|