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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9654134c87faac00b19343eb041d4c7be5bafe14
4
- data.tar.gz: d81dc5a1dc3955ec339d32cfe39f1e18f85cd876
3
+ metadata.gz: c2655f3b4c932dcf453acb970aa41f6ae9ff774d
4
+ data.tar.gz: 6689f06c21c986ba2bcb23aae214bf98a4cc582e
5
5
  SHA512:
6
- metadata.gz: 4f1233cc97367d154e742a0d72fb333f117e123eefc7145be68f740bd4733e8396584f6db6a97b0d5a1d21d7a873fb2e4a3e79ddd9f0776be572b02d67c00af4
7
- data.tar.gz: 932fb164588d973f55ea9e0d472fc5a50ade3014d8fadbb3deaaae8ad1b604e015b61959ee1c8b33b97f3d42f9ba8a040b5baeff741c7d377bc0e4b089d0b455
6
+ metadata.gz: 7019da94e90e103908c78534428ca6dd93ad8319dacd04d49e332924dc1aa7fc146a93ab95d83f545e4e2a3392573ce1e3c082fae63feeeec427402a32175937
7
+ data.tar.gz: 29f7d9d5f14c50853c4234fdfaa840e20809ed5efb912b1f6a1374acb1c03edbaa93ed17ab2f487b1a806917e53d64b28dc0e76273b66214b0d7ebe542fd78ce
@@ -54,31 +54,31 @@ module Marathon
54
54
  end
55
55
 
56
56
  def apps
57
- Marathon::Apps.new(connection)
57
+ Marathon::Apps.new(self)
58
58
  end
59
59
 
60
60
  def groups
61
- Marathon::Groups.new(connection)
61
+ Marathon::Groups.new(self)
62
62
  end
63
63
 
64
64
  def deployments
65
- Marathon::Deployments.new(connection)
65
+ Marathon::Deployments.new(self)
66
66
  end
67
67
 
68
68
  def tasks
69
- Marathon::Tasks.new(connection)
69
+ Marathon::Tasks.new(self)
70
70
  end
71
71
 
72
72
  def queues
73
- Marathon::Queues.new(connection)
73
+ Marathon::Queues.new(self)
74
74
  end
75
75
 
76
76
  def leaders
77
- Marathon::Leader.new(connection)
77
+ Marathon::Leader.new(self)
78
78
  end
79
79
 
80
80
  def event_subscriptions
81
- Marathon::EventSubscriptions.new(connection)
81
+ Marathon::EventSubscriptions.new(self)
82
82
  end
83
83
 
84
84
  end
@@ -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
- self.class.version(id, version)
44
+ @marathon_instance.apps.version(id, version)
44
45
  else
45
- self.class.versions(id)
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 = self.class.get(id)
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
- self.class.restart(id, force)
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
- self.class.change(id, new_hash, force)
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(connection)
237
- @connection = connection
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
@@ -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
- self.class.delete(id, force)
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(connection)
54
- @connection = connection
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 = Marathon::Deployment.list
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(connection)
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.
@@ -5,7 +5,7 @@ class Marathon::Group < Marathon::Base
5
5
  ACCESSORS = %w[ id dependencies version ]
6
6
 
7
7
  DEFAULTS = {
8
- :dependencies => []
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 = self.class.get(id)
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
- self.class.start(info)
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
- self.class.change(id, new_hash, force, dry_run)
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
- json = Marathon.connection.get("/v2/groups/#{id}")
111
- new(json)
110
+ Marathon.singleton.groups.get(id)
112
111
  end
113
112
 
114
113
  # List all groups.
115
114
  def list
116
- json = Marathon.connection.get('/v2/groups')
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
- query = {}
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
- json = Marathon.connection.post('/v2/groups', nil, :body => hash)
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
- query = {}
168
- query[:force] = true if force
169
- query[:dryRun] = true if dry_run
170
- json = Marathon.connection.put("/v2/groups/#{id}", query, :body => hash)
171
- if dry_run
172
- json['steps'].map { |e| Marathon::DeploymentStep.new(e) }
173
- else
174
- Marathon::DeploymentInfo.new(json)
175
- end
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
+
@@ -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(connection)
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.
@@ -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(connection)
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.
@@ -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(connection)
79
- @connection = connection
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
@@ -1,3 +1,3 @@
1
1
  module Marathon
2
- VERSION = '1.3.6'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -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
- subject { described_class.new({ 'id' => '/ubuntu2' }) }
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(described_class).to receive(:versions).with('/ubuntu2') { ['foo-version'] }
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(described_class).to receive(:version).with('/ubuntu2', 'foo-version') {
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
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(described_class).to receive(:change).with(
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(described_class).to receive(:change)
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
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(described_class).to receive(:get) { described_class.new('id' => subject.id) }
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(described_class).to receive(:get).with('/app/foo') do
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(described_class).to receive(:get).with('/app/foo') do
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
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(described_class).to receive(:restart)
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(described_class).to receive(:restart)
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(described_class).to receive(:restart)
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
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(described_class).to receive(:change)
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(described_class).to receive(:change).with('/app/foo', {:instances => 9000 }, false)
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
- subject { described_class.new({:id => '/app/foo', :instances => 10}) }
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(described_class).to receive(:change)
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
- subject { described_class.new({:id => '/app/foo', :instances => 10}) }
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(described_class).to receive(:change)
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
- subject { described_class.new({'id' => '/app/foo', :instances => 10}) }
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(described_class).to receive(:change)
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
- subject { described_class.new(DEPLOYMENT_INFO_EXAMPLE) }
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(Marathon::Deployment).to receive(:list) { [] }
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
- subject { described_class.new(DEPLOYMENT_EXAMPLE) }
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(described_class).to receive(:delete).with(DEPLOYMENT_EXAMPLE[:id], false)
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(described_class).to receive(:delete).with(DEPLOYMENT_EXAMPLE[:id], true)
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
 
@@ -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{subject.new(:apps => [{:id => 'app'}], :groups => [{:id => 'group'}], :id => '/foo')}
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
- subject { described_class.new({ 'id' => '/group/foo' }) }
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(described_class).to receive(:start)
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
83
+ before(:each) do
81
84
 
82
- it 'refreshs the group' do
83
- expect(described_class).to receive(:get).with('/app/foo') do
84
- described_class.new({ 'id' => '/app/foo', 'refreshed' => true })
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
- subject { described_class.new({ 'id' => '/app/foo' }) }
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(described_class).to receive(:change).with('/app/foo', {:instances => 9000 }, false, false)
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(described_class).to receive(:change).with('/app/foo', {:instances => 9000 }, false, false)
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
- it 'gets the group', :vcr do
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')
@@ -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}}'
@@ -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)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marathon-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Bechstein