marathon-api 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/bin/marathon +1 -1
- data/lib/marathon.rb +4 -6
- data/lib/marathon/app.rb +27 -21
- data/lib/marathon/connection.rb +11 -11
- data/lib/marathon/constraint.rb +1 -1
- data/lib/marathon/container.rb +2 -2
- data/lib/marathon/container_docker.rb +2 -2
- data/lib/marathon/container_docker_port_mapping.rb +2 -2
- data/lib/marathon/container_volume.rb +1 -1
- data/lib/marathon/deployment.rb +4 -1
- data/lib/marathon/deployment_action.rb +1 -0
- data/lib/marathon/deployment_info.rb +3 -2
- data/lib/marathon/deployment_step.rb +1 -1
- data/lib/marathon/error.rb +24 -16
- data/lib/marathon/event_subscriptions.rb +1 -1
- data/lib/marathon/group.rb +2 -1
- data/lib/marathon/health_check.rb +7 -7
- data/lib/marathon/leader.rb +1 -1
- data/lib/marathon/queue.rb +2 -1
- data/lib/marathon/task.rb +7 -3
- data/lib/marathon/util.rb +7 -7
- data/lib/marathon/version.rb +1 -1
- data/spec/marathon/app_spec.rb +58 -54
- data/spec/marathon/base_spec.rb +10 -10
- data/spec/marathon/container_docker_port_mapping_spec.rb +7 -7
- data/spec/marathon/container_docker_spec.rb +13 -13
- data/spec/marathon/container_spec.rb +9 -9
- data/spec/marathon/container_volume_spec.rb +4 -4
- data/spec/marathon/deployment_action_spec.rb +1 -1
- data/spec/marathon/deployment_info_spec.rb +2 -2
- data/spec/marathon/deployment_spec.rb +19 -19
- data/spec/marathon/deployment_step_spec.rb +4 -4
- data/spec/marathon/error_spec.rb +7 -7
- data/spec/marathon/group_spec.rb +47 -47
- data/spec/marathon/marathon_spec.rb +1 -1
- data/spec/marathon/queue_spec.rb +9 -9
- data/spec/marathon/task_spec.rb +12 -12
- data/spec/marathon/util_spec.rb +17 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b60887f834b4861afd26cac261c219767fbd208
|
4
|
+
data.tar.gz: b25e03b3dc591c0f3503cb60a3c8c4b528fe032e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66917b9f6d31568d01dcab7c31c083ef4a1d53d4423ddb1435c78cb86b76e2b5e069f630c2a9aa920c1ac1bc9e24746baa5894962e9fded20fd698dafae8ba72
|
7
|
+
data.tar.gz: 2d20bb4db6d22dd4c1ebf3cfee576b34616fd10547fa48bb69b43ed70b4965a9d6ed2a9b0e83890058752141051bd1af33028a29ccb5274d63c3944177084bfc
|
data/.travis.yml
CHANGED
data/bin/marathon
CHANGED
@@ -110,7 +110,7 @@ end
|
|
110
110
|
def subcmd_kill_tasks(cmd_opts)
|
111
111
|
if cmd_opts[:task_id]
|
112
112
|
puts "Killing task of '#{cmd_opts[:id]}' with id '#{cmd_opts[:task_id]}'"
|
113
|
-
tasks = [Marathon::Task.delete(cmd_opts[:
|
113
|
+
tasks = [Marathon::Task.delete(cmd_opts[:task_id], cmd_opts[:scale])]
|
114
114
|
elsif cmd_opts[:host]
|
115
115
|
puts "Killing tasks of '#{cmd_opts[:id]}' on host '#{cmd_opts[:host]}'"
|
116
116
|
tasks = Marathon::Task.delete_all(cmd_opts[:id], cmd_opts[:host], cmd_opts[:scale])
|
data/lib/marathon.rb
CHANGED
@@ -37,7 +37,7 @@ module Marathon
|
|
37
37
|
attr_reader :connection
|
38
38
|
|
39
39
|
def initialize(url, options)
|
40
|
-
@connection = Connection.new(url,options)
|
40
|
+
@connection = Connection.new(url, options)
|
41
41
|
end
|
42
42
|
|
43
43
|
def ping
|
@@ -88,7 +88,7 @@ module Marathon
|
|
88
88
|
|
89
89
|
attr_reader :singleton
|
90
90
|
|
91
|
-
@singleton = MarathonInstance::new(DEFAULT_URL,{})
|
91
|
+
@singleton = MarathonInstance::new(DEFAULT_URL, {})
|
92
92
|
|
93
93
|
# Get the marathon url from environment
|
94
94
|
def env_url
|
@@ -134,7 +134,7 @@ module Marathon
|
|
134
134
|
|
135
135
|
|
136
136
|
def reset_singleton!
|
137
|
-
@singleton = MarathonInstance.new(url,options)
|
137
|
+
@singleton = MarathonInstance.new(url, options)
|
138
138
|
end
|
139
139
|
|
140
140
|
def reset_connection!
|
@@ -156,7 +156,5 @@ module Marathon
|
|
156
156
|
end
|
157
157
|
|
158
158
|
module_function :connection, :env_options, :env_url, :info, :logger, :logger=, :ping, :metrics,
|
159
|
-
:options, :options=, :url, :url
|
160
|
-
|
161
|
-
|
159
|
+
:options, :options=, :url, :url=, :reset_connection!, :reset_singleton!, :singleton
|
162
160
|
end
|
data/lib/marathon/app.rb
CHANGED
@@ -7,10 +7,10 @@ class Marathon::App < Marathon::Base
|
|
7
7
|
deployments uris user version labels ]
|
8
8
|
|
9
9
|
DEFAULTS = {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
:env => {},
|
11
|
+
:labels => {},
|
12
|
+
:ports => [],
|
13
|
+
:uris => [],
|
14
14
|
}
|
15
15
|
|
16
16
|
attr_reader :healthChecks, :constraints, :container, :read_only, :tasks
|
@@ -19,7 +19,8 @@ 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
|
-
|
22
|
+
# ++marathon_instance++: MarathonInstance holding a connection to marathon
|
23
|
+
def initialize(hash, marathon_instance = Marathon.singleton, read_only = false)
|
23
24
|
super(Marathon::Util.merge_keywordized_hash(DEFAULTS, hash), ACCESSORS)
|
24
25
|
raise ArgumentError, 'App must have an id' unless id
|
25
26
|
@read_only = read_only
|
@@ -121,17 +122,20 @@ class Marathon::App < Marathon::Base
|
|
121
122
|
# Returns a string for listing the application.
|
122
123
|
def to_pretty_s
|
123
124
|
%Q[
|
124
|
-
App ID: #{id}
|
125
|
-
Instances: #{tasks.size}/#{instances}
|
126
|
-
Command: #{cmd}
|
127
|
-
CPUs: #{cpus}
|
128
|
-
Memory: #{mem} MB
|
129
|
-
#{pretty_container}
|
130
|
-
#{pretty_uris}
|
131
|
-
#{pretty_env}
|
132
|
-
#{pretty_constraints}
|
133
|
-
Version: #{version}
|
134
|
-
]
|
125
|
+
App ID: #{id}
|
126
|
+
Instances: #{tasks.size}/#{instances}
|
127
|
+
Command: #{cmd}
|
128
|
+
CPUs: #{cpus}
|
129
|
+
Memory: #{mem} MB
|
130
|
+
#{pretty_container}
|
131
|
+
#{pretty_uris}
|
132
|
+
#{pretty_env}
|
133
|
+
#{pretty_constraints}
|
134
|
+
Version: #{version}
|
135
|
+
]
|
136
|
+
.gsub(/\n\s+/, "\n")
|
137
|
+
.gsub(/\n\n+/, "\n")
|
138
|
+
.strip
|
135
139
|
end
|
136
140
|
|
137
141
|
private
|
@@ -143,7 +147,7 @@ Version: #{version}
|
|
143
147
|
end
|
144
148
|
|
145
149
|
def pretty_env
|
146
|
-
env.map { |k,v| "ENV: #{k}=#{v}" }.join("\n")
|
150
|
+
env.map { |k, v| "ENV: #{k}=#{v}" }.join("\n")
|
147
151
|
end
|
148
152
|
|
149
153
|
def pretty_uris
|
@@ -181,7 +185,7 @@ Version: #{version}
|
|
181
185
|
# "apps.tasks". Apps' tasks are not embedded in the response by default.
|
182
186
|
# "apps.failures". Apps' last failures are not embedded in the response by default.
|
183
187
|
def list(cmd = nil, embed = nil, id=nil, label=nil)
|
184
|
-
Marathon.singleton.apps.list(cmd,embed, id, label)
|
188
|
+
Marathon.singleton.apps.list(cmd, embed, id, label)
|
185
189
|
end
|
186
190
|
|
187
191
|
# Delete the application with id.
|
@@ -189,6 +193,7 @@ Version: #{version}
|
|
189
193
|
def delete(id)
|
190
194
|
Marathon.singleton.apps.delete(id)
|
191
195
|
end
|
196
|
+
|
192
197
|
alias :remove :delete
|
193
198
|
|
194
199
|
# Create and start an application.
|
@@ -197,6 +202,7 @@ Version: #{version}
|
|
197
202
|
def start(hash)
|
198
203
|
Marathon.singleton.apps.start(hash)
|
199
204
|
end
|
205
|
+
|
200
206
|
alias :create :start
|
201
207
|
|
202
208
|
# Restart the application with id.
|
@@ -204,7 +210,7 @@ Version: #{version}
|
|
204
210
|
# ++force++: If the app is affected by a running deployment, then the update operation will fail.
|
205
211
|
# The current deployment can be overridden by setting the `force` query parameter.
|
206
212
|
def restart(id, force = false)
|
207
|
-
Marathon.singleton.apps.restart(id,force)
|
213
|
+
Marathon.singleton.apps.restart(id, force)
|
208
214
|
end
|
209
215
|
|
210
216
|
# Change parameters of a running application. The new application parameters apply only to subsequently
|
@@ -214,7 +220,7 @@ Version: #{version}
|
|
214
220
|
# ++force++: If the app is affected by a running deployment, then the update operation will fail.
|
215
221
|
# The current deployment can be overridden by setting the `force` query parameter.
|
216
222
|
def change(id, hash, force = false)
|
217
|
-
Marathon.singleton.apps.change(id,hash,force)
|
223
|
+
Marathon.singleton.apps.change(id, hash, force)
|
218
224
|
end
|
219
225
|
|
220
226
|
# List the versions of the application with id.
|
@@ -227,7 +233,7 @@ Version: #{version}
|
|
227
233
|
# ++id++: Application id
|
228
234
|
# ++version++: Version name
|
229
235
|
def version(id, version)
|
230
|
-
Marathon.singleton.apps.version(id,version)
|
236
|
+
Marathon.singleton.apps.version(id, version)
|
231
237
|
end
|
232
238
|
end
|
233
239
|
end
|
data/lib/marathon/connection.rb
CHANGED
@@ -5,9 +5,9 @@ class Marathon::Connection
|
|
5
5
|
include HTTParty
|
6
6
|
|
7
7
|
headers(
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
'Content-Type' => 'application/json',
|
9
|
+
'Accept' => 'application/json',
|
10
|
+
'User-Agent' => "ub0r/Marathon-API #{Marathon::VERSION}"
|
11
11
|
)
|
12
12
|
|
13
13
|
default_timeout 5
|
@@ -23,8 +23,8 @@ class Marathon::Connection
|
|
23
23
|
@options = options
|
24
24
|
if @options[:username] and @options[:password]
|
25
25
|
@options[:basic_auth] = {
|
26
|
-
|
27
|
-
|
26
|
+
:username => @options[:username],
|
27
|
+
:password => @options[:password]
|
28
28
|
}
|
29
29
|
@options.delete(:username)
|
30
30
|
@options.delete(:password)
|
@@ -47,14 +47,14 @@ class Marathon::Connection
|
|
47
47
|
"Marathon::Connection { :url => #{url} :options => #{options} }"
|
48
48
|
end
|
49
49
|
|
50
|
-
private
|
50
|
+
private
|
51
51
|
|
52
52
|
# Create URL suffix for a hash of query parameters.
|
53
53
|
# URL escaping is done internally.
|
54
54
|
# ++query++: Hash of query parameters.
|
55
55
|
def query_params(query)
|
56
|
-
query = query.select { |k,v| !v.nil? }
|
57
|
-
URI.escape(query.map { |k,v| "#{k}=#{v}" }.join('&'))
|
56
|
+
query = query.select { |k, v| !v.nil? }
|
57
|
+
URI.escape(query.map { |k, v| "#{k}=#{v}" }.join('&'))
|
58
58
|
end
|
59
59
|
|
60
60
|
# Create request object.
|
@@ -68,9 +68,9 @@ private
|
|
68
68
|
headers = opts.delete(:headers) || {}
|
69
69
|
opts[:body] = opts[:body].to_json unless opts[:body].nil?
|
70
70
|
{
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
:method => http_method,
|
72
|
+
:url => "#{@url}#{path}",
|
73
|
+
:query => query
|
74
74
|
}.merge(@options).merge(opts).reject { |_, v| v.nil? }
|
75
75
|
end
|
76
76
|
|
data/lib/marathon/constraint.rb
CHANGED
@@ -7,7 +7,7 @@ class Marathon::Constraint < Marathon::Base
|
|
7
7
|
def initialize(array)
|
8
8
|
raise Marathon::Error::ArgumentError, 'array must be an Array' unless array.is_a?(Array)
|
9
9
|
raise Marathon::Error::ArgumentError,
|
10
|
-
|
10
|
+
'array must be [attribute, operator, parameter] where only parameter is optional' \
|
11
11
|
unless array.size != 2 or array.size != 3
|
12
12
|
super
|
13
13
|
end
|
data/lib/marathon/container.rb
CHANGED
@@ -4,8 +4,8 @@ class Marathon::ContainerDockerPortMapping < Marathon::Base
|
|
4
4
|
|
5
5
|
ACCESSORS = %w[ containerPort hostPort servicePort protocol ]
|
6
6
|
DEFAULTS = {
|
7
|
-
|
8
|
-
|
7
|
+
:protocol => 'tcp',
|
8
|
+
:hostPort => 0
|
9
9
|
}
|
10
10
|
|
11
11
|
# Create a new container docker port mappint object.
|
data/lib/marathon/deployment.rb
CHANGED
@@ -22,6 +22,7 @@ class Marathon::Deployment < Marathon::Base
|
|
22
22
|
def delete(force = false)
|
23
23
|
@marathon_instance.deployments.delete(id, force)
|
24
24
|
end
|
25
|
+
|
25
26
|
alias :cancel :delete
|
26
27
|
|
27
28
|
def to_s
|
@@ -42,8 +43,9 @@ class Marathon::Deployment < Marathon::Base
|
|
42
43
|
# is created to restore the previous configuration. If set to true, then the deployment
|
43
44
|
# is still canceled but no rollback deployment is created.
|
44
45
|
def delete(id, force = false)
|
45
|
-
Marathon.singleton.deployments.delete(id,force)
|
46
|
+
Marathon.singleton.deployments.delete(id, force)
|
46
47
|
end
|
48
|
+
|
47
49
|
alias :cancel :delete
|
48
50
|
alias :remove :delete
|
49
51
|
end
|
@@ -55,6 +57,7 @@ class Marathon::Deployments
|
|
55
57
|
@marathon_instance = marathon_instance
|
56
58
|
@connection = @marathon_instance.connection
|
57
59
|
end
|
60
|
+
|
58
61
|
# List running deployments.
|
59
62
|
def list
|
60
63
|
json = @connection.get('/v2/deployments')
|
@@ -6,7 +6,8 @@ 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
|
-
|
9
|
+
# ++marathon_instance++: MarathonInstance holding a connection to marathon
|
10
|
+
def initialize(hash, marathon_instance = Marathon.singleton)
|
10
11
|
super(hash, %w[deploymentId version])
|
11
12
|
raise Marathon::Error::ArgumentError, 'version must not be nil' unless version
|
12
13
|
@marathon_instance = marathon_instance
|
@@ -17,7 +18,7 @@ class Marathon::DeploymentInfo < Marathon::Base
|
|
17
18
|
def wait(timeout = 60)
|
18
19
|
Timeout::timeout(timeout) do
|
19
20
|
deployments = nil
|
20
|
-
while deployments.nil? or deployments.
|
21
|
+
while deployments.nil? or deployments.any? { |e| e.id == deploymentId } do
|
21
22
|
sleep(RECHECK_INTERVAL)
|
22
23
|
deployments = @marathon_instance.deployments.list
|
23
24
|
end
|
@@ -15,7 +15,7 @@ class Marathon::DeploymentStep < Marathon::Base
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def to_s
|
18
|
-
"Marathon::DeploymentStep { :actions => #{actions.map{|e| e.to_pretty_s}.join(',')} }"
|
18
|
+
"Marathon::DeploymentStep { :actions => #{actions.map { |e| e.to_pretty_s }.join(',')} }"
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
data/lib/marathon/error.rb
CHANGED
@@ -2,28 +2,36 @@
|
|
2
2
|
module Marathon::Error
|
3
3
|
# The default error. It's never actually raised, but can be used to catch all
|
4
4
|
# gem-specific errors that are thrown as they all subclass from this.
|
5
|
-
class MarathonError < StandardError;
|
5
|
+
class MarathonError < StandardError;
|
6
|
+
end
|
6
7
|
|
7
8
|
# Raised when invalid arguments are passed to a method.
|
8
|
-
class ArgumentError < MarathonError;
|
9
|
+
class ArgumentError < MarathonError;
|
10
|
+
end
|
9
11
|
|
10
12
|
# Raised when a request returns a 400 or 422.
|
11
|
-
class ClientError < MarathonError;
|
13
|
+
class ClientError < MarathonError;
|
14
|
+
end
|
12
15
|
|
13
16
|
# Raised when a request returns a 404.
|
14
|
-
class NotFoundError < MarathonError;
|
17
|
+
class NotFoundError < MarathonError;
|
18
|
+
end
|
15
19
|
|
16
20
|
# Raised when there is an unexpected response code / body.
|
17
|
-
class UnexpectedResponseError < MarathonError;
|
21
|
+
class UnexpectedResponseError < MarathonError;
|
22
|
+
end
|
18
23
|
|
19
24
|
# Raised when a request times out.
|
20
|
-
class TimeoutError < MarathonError;
|
25
|
+
class TimeoutError < MarathonError;
|
26
|
+
end
|
21
27
|
|
22
28
|
# Raised when login fails.
|
23
|
-
class AuthenticationError < MarathonError;
|
29
|
+
class AuthenticationError < MarathonError;
|
30
|
+
end
|
24
31
|
|
25
32
|
# Raised when an IO action fails.
|
26
|
-
class IOError < MarathonError;
|
33
|
+
class IOError < MarathonError;
|
34
|
+
end
|
27
35
|
|
28
36
|
# Raise error specific to http response.
|
29
37
|
# ++response++: HTTParty response object.
|
@@ -37,14 +45,14 @@ module Marathon::Error
|
|
37
45
|
# ++response++: HTTParty response object.
|
38
46
|
def error_class(response)
|
39
47
|
case response.code
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
when 400
|
49
|
+
ClientError
|
50
|
+
when 422
|
51
|
+
ClientError
|
52
|
+
when 404
|
53
|
+
NotFoundError
|
54
|
+
else
|
55
|
+
UnexpectedResponseError
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
@@ -2,7 +2,7 @@
|
|
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(marathon_instance)
|
5
|
+
def initialize(marathon_instance = Marathon.singleton)
|
6
6
|
@connection = marathon_instance.connection
|
7
7
|
end
|
8
8
|
|
data/lib/marathon/group.rb
CHANGED
@@ -13,7 +13,8 @@ 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
|
-
|
16
|
+
# ++marathon_instance++: MarathonInstance holding a connection to marathon
|
17
|
+
def initialize(hash, marathon_instance = Marathon.singleton)
|
17
18
|
super(Marathon::Util.merge_keywordized_hash(DEFAULTS, hash), ACCESSORS)
|
18
19
|
@marathon_instance = marathon_instance
|
19
20
|
raise ArgumentError, 'Group must have an id' unless id
|
@@ -3,13 +3,13 @@
|
|
3
3
|
class Marathon::HealthCheck < Marathon::Base
|
4
4
|
|
5
5
|
DEFAULTS = {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
:gracePeriodSeconds => 300,
|
7
|
+
:intervalSeconds => 60,
|
8
|
+
:maxConsecutiveFailures => 3,
|
9
|
+
:path => '/',
|
10
|
+
:portIndex => 0,
|
11
|
+
:protocol => 'HTTP',
|
12
|
+
:timeoutSeconds => 20
|
13
13
|
}
|
14
14
|
|
15
15
|
ACCESSORS = %w[ command gracePeriodSeconds intervalSeconds maxConsecutiveFailures
|