marathon_deploy 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/deploy.rb +14 -14
- data/bin/json2yaml.rb +1 -1
- data/examples/jondeploy.yaml +1 -2
- data/examples/jondeploy2.yaml +4 -2
- data/lib/marathon_deploy/application.rb +4 -1
- data/lib/marathon_deploy/deployment.rb +15 -8
- data/lib/marathon_deploy/environment.rb +4 -1
- data/lib/marathon_deploy/error.rb +4 -2
- data/lib/marathon_deploy/http_util.rb +3 -1
- data/lib/marathon_deploy/macro.rb +8 -5
- data/lib/marathon_deploy/marathon_client.rb +6 -4
- data/lib/marathon_deploy/marathon_defaults.rb +6 -7
- data/lib/marathon_deploy/utils.rb +4 -2
- data/lib/marathon_deploy/version.rb +1 -1
- data/lib/marathon_deploy/yaml_json.rb +3 -1
- metadata +2 -4
- data/bin/deploy +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2064827ef363519d13290fa9e84e34b37d15a954
|
4
|
+
data.tar.gz: 9bb6235b0c8b3421cb3904561a67d022a6a72f5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652ed65844e48852e55d1eb8a69436ab042df65139c0c7af24c3d34f94008a511c6275a68aaf6e94499a01bceba4dfdf3e00149484350b2cb6b7dab10a461651
|
7
|
+
data.tar.gz: 7be0be184f7d07d62e2457965e1d1723a03fa926c0bb6e633b5b1f970d8e359ed81e42b18dafb122f4b5b02add40d87d76e29fbf23ff6e43bcf115948560af7d
|
data/bin/deploy.rb
CHANGED
@@ -11,11 +11,11 @@ require 'logger'
|
|
11
11
|
options = {}
|
12
12
|
|
13
13
|
# DEFAULTS
|
14
|
-
options[:deployfile] = MarathonDefaults::DEFAULT_DEPLOYFILE
|
15
|
-
options[:verbose] = MarathonDefaults::DEFAULT_LOGLEVEL
|
16
|
-
options[:environment] = MarathonDefaults::DEFAULT_ENVIRONMENT_NAME
|
14
|
+
options[:deployfile] = MarathonDeploy::MarathonDefaults::DEFAULT_DEPLOYFILE
|
15
|
+
options[:verbose] = MarathonDeploy::MarathonDefaults::DEFAULT_LOGLEVEL
|
16
|
+
options[:environment] = MarathonDeploy::MarathonDefaults::DEFAULT_ENVIRONMENT_NAME
|
17
17
|
options[:marathon_endpoints] = nil
|
18
|
-
options[:logfile] = MarathonDefaults::DEFAULT_LOGFILE
|
18
|
+
options[:logfile] = MarathonDeploy::MarathonDefaults::DEFAULT_LOGFILE
|
19
19
|
|
20
20
|
OptionParser.new do |opts|
|
21
21
|
opts.banner = "Usage: deploy.rb [options]"
|
@@ -50,22 +50,22 @@ $LOG = options[:logfile] ? Logger.new(options[:logfile]) : Logger.new(STDOUT)
|
|
50
50
|
$LOG.level = options[:verbose]
|
51
51
|
|
52
52
|
deployfile = options[:deployfile]
|
53
|
-
environment = Environment.new(options[:environment])
|
53
|
+
environment = MarathonDeploy::Environment.new(options[:environment])
|
54
54
|
|
55
55
|
marathon_endpoints = Array.new
|
56
56
|
if (options[:marathon_endpoints].nil?)
|
57
57
|
if (environment.is_production?)
|
58
|
-
marathon_endpoints = MarathonDefaults::DEFAULT_PRODUCTION_MARATHON_ENDPOINTS
|
58
|
+
marathon_endpoints = MarathonDeploy::MarathonDefaults::DEFAULT_PRODUCTION_MARATHON_ENDPOINTS
|
59
59
|
else
|
60
|
-
marathon_endpoints = MarathonDefaults::DEFAULT_PREPRODUCTION_MARATHON_ENDPOINTS
|
60
|
+
marathon_endpoints = MarathonDeploy::MarathonDefaults::DEFAULT_PREPRODUCTION_MARATHON_ENDPOINTS
|
61
61
|
end
|
62
62
|
else
|
63
63
|
marathon_endpoints = options[:marathon_endpoints]
|
64
64
|
end
|
65
65
|
|
66
66
|
begin
|
67
|
-
application = Application.new(deployfile)
|
68
|
-
rescue Error::IOError, Error::UndefinedMacroError,Error::MissingMarathonAttributesError,Error::UnsupportedFileExtension => e
|
67
|
+
application = MarathonDeploy::Application.new(deployfile)
|
68
|
+
rescue MarathonDeploy::Error::IOError, MarathonDeploy::Error::UndefinedMacroError,MarathonDeploy::Error::MissingMarathonAttributesError,MarathonDeploy::Error::UnsupportedFileExtension => e
|
69
69
|
$LOG.debug(e)
|
70
70
|
$LOG.error(e.message)
|
71
71
|
exit!
|
@@ -73,7 +73,7 @@ end
|
|
73
73
|
|
74
74
|
begin
|
75
75
|
application.add_envs({ :APPLICATION_NAME => application.id, :ENVIRONMENT => environment})
|
76
|
-
rescue Error::BadFormatError => e
|
76
|
+
rescue MarathonDeploy::Error::BadFormatError => e
|
77
77
|
$LOG.error(e)
|
78
78
|
exit!
|
79
79
|
end
|
@@ -89,16 +89,16 @@ puts "#" * 100
|
|
89
89
|
# deploy to each endpoint
|
90
90
|
marathon_endpoints.each do |marathon_url|
|
91
91
|
begin
|
92
|
-
client = MarathonClient.new(marathon_url)
|
92
|
+
client = MarathonDeploy::MarathonClient.new(marathon_url)
|
93
93
|
client.application = application
|
94
94
|
client.deploy
|
95
|
-
rescue Error::MissingMarathonAttributesError,Error::BadURLError, Timeout::Error => e
|
95
|
+
rescue MarathonDeploy::Error::MissingMarathonAttributesError,MarathonDeploy::Error::BadURLError, Timeout::Error => e
|
96
96
|
$LOG.error(e.message)
|
97
97
|
exit!
|
98
|
-
rescue Error::DeploymentError => e
|
98
|
+
rescue MarathonDeploy::Error::DeploymentError => e
|
99
99
|
$LOG.error("Deployment of #{application} failed => #{e}")
|
100
100
|
exit!
|
101
|
-
rescue SocketError, Error::MarathonError
|
101
|
+
rescue SocketError, MarathonDeploy::Error::MarathonError => e
|
102
102
|
$LOG.error("Problem talking to marathon endpoint => #{marathon_url} (#{e.message})")
|
103
103
|
exit!
|
104
104
|
end
|
data/bin/json2yaml.rb
CHANGED
data/examples/jondeploy.yaml
CHANGED
@@ -4,13 +4,12 @@ cpus: 0.5
|
|
4
4
|
env:
|
5
5
|
APPLICATION_NAME: public-search-germany-webapp
|
6
6
|
CONFIG_ASSEMBLER_BASE_URL: http://mobile-config-assembler.service.consul/config-assembler
|
7
|
-
DATACENTER_NUMBER: '666'
|
8
7
|
JAVA_XMS: 252m
|
9
8
|
JAVA_XMX: 504m
|
10
9
|
SERVERCLASS_NAME: pubse
|
11
10
|
SERVICE_8009_NAME: public-search-germany-webapp
|
12
11
|
SERVICE_8009_TAGS: ajp
|
13
12
|
id: public-search-germany-webapp
|
14
|
-
instances:
|
13
|
+
instances: 6
|
15
14
|
mem: 32
|
16
15
|
uris: []
|
data/examples/jondeploy2.yaml
CHANGED
@@ -2,17 +2,19 @@
|
|
2
2
|
cmd: while true ; do echo "i got probed ..." ; /bin/nc -l -p $PORT0 ; done
|
3
3
|
cpus: 0.5
|
4
4
|
env:
|
5
|
+
A_MACRO_TEST: %%SPECIAL_PROPERTY%%
|
5
6
|
APPLICATION_NAME: public-search-germany-webapp
|
6
7
|
CONFIG_ASSEMBLER_BASE_URL: http://mobile-config-assembler.service.consul/config-assembler
|
7
8
|
DATACENTER_NUMBER: '666'
|
8
9
|
JAVA_XMS: 252m
|
9
10
|
JAVA_XMX: 504m
|
10
|
-
SPECIAL_PROPERTY: %%SPECIAL_PROPERTY%%
|
11
|
+
SPECIAL_PROPERTY: %%SPECIAL_PROPERTY%%%%SPECIAL_PROPERTY%%
|
11
12
|
SERVERCLASS_NAME: pubse
|
12
13
|
SERVICE_8009_NAME: public-search-germany-webapp
|
13
14
|
SERVICE_8009_TAGS: ajp
|
15
|
+
ANOTHER_MACRO_TEST: %%SPECIAL_PROPERTY%%
|
14
16
|
id: content-webapp
|
15
|
-
instances:
|
17
|
+
instances: 6
|
16
18
|
mem: 32
|
17
19
|
uris: []
|
18
20
|
healthChecks:
|
@@ -3,7 +3,9 @@ require 'marathon_deploy/yaml_json'
|
|
3
3
|
require 'marathon_deploy/error'
|
4
4
|
require 'marathon_deploy/utils'
|
5
5
|
|
6
|
-
|
6
|
+
module MarathonDeploy
|
7
|
+
|
8
|
+
class Application
|
7
9
|
|
8
10
|
attr_reader :json, :id
|
9
11
|
attr_accessor :envs
|
@@ -82,4 +84,5 @@ class Application
|
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
87
|
+
end
|
85
88
|
end
|
@@ -3,7 +3,8 @@ require 'marathon_deploy/utils'
|
|
3
3
|
require 'marathon_deploy/marathon_defaults'
|
4
4
|
require 'timeout'
|
5
5
|
|
6
|
-
|
6
|
+
module MarathonDeploy
|
7
|
+
class Deployment
|
7
8
|
|
8
9
|
DEPLOYMENT_RECHECK_INTERVAL = MarathonDefaults::DEPLOYMENT_RECHECK_INTERVAL
|
9
10
|
DEPLOYMENT_TIMEOUT = MarathonDefaults::DEPLOYMENT_TIMEOUT
|
@@ -57,7 +58,7 @@ class Deployment
|
|
57
58
|
#STDOUT.puts "" if ( $LOG.level == 1 )
|
58
59
|
if (deployment_seen)
|
59
60
|
elapsedTime = '%.2f' % (Time.now - startTime)
|
60
|
-
$LOG.info("Deployment with deploymentId #{@deploymentId} ended (Total time #{elapsedTime}s
|
61
|
+
$LOG.info("Deployment with deploymentId #{@deploymentId} ended (Total deployment time #{elapsedTime}s)")
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -83,20 +84,25 @@ class Deployment
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
def wait_until_healthy
|
87
|
+
def wait_until_healthy
|
88
|
+
startTime = Time.now
|
87
89
|
Timeout::timeout(HEALTHY_WAIT_TIMEOUT) do
|
88
90
|
loop do
|
89
91
|
break if (!health_checks_defined?)
|
90
92
|
sick = get_alive("false")
|
93
|
+
elapsedTime = '%.2f' % (Time.now - startTime)
|
91
94
|
if (!sick.empty?)
|
92
|
-
$LOG.info("#{sick.size}/#{@application.instances} instances are not healthy
|
95
|
+
$LOG.info("#{sick.size}/#{@application.instances} instances are not healthy, retrying in #{HEALTHY_WAIT_RECHECK_INTERVAL}s (elapsed time #{elapsedTime}s)")
|
96
|
+
$LOG.debug("Sick instances: " + sick.join(','))
|
93
97
|
else
|
94
98
|
healthy = get_alive("true")
|
95
99
|
if (healthy.size == @application.instances)
|
96
|
-
|
100
|
+
elapsedTime = '%.2f' % (Time.now - startTime)
|
101
|
+
$LOG.info("#{healthy.size} of #{@application.instances} expected instances are healthy (Total health-check time #{elapsedTime}s).")
|
102
|
+
$LOG.debug("Healthy instances running: " + healthy.join(','))
|
97
103
|
break
|
98
104
|
else
|
99
|
-
$LOG.info("#{healthy.size}
|
105
|
+
$LOG.info("#{healthy.size} healthy instances seen, #{@application.instances} healthy instances expected, retrying in in #{HEALTHY_WAIT_RECHECK_INTERVAL}s")
|
100
106
|
end
|
101
107
|
end
|
102
108
|
sleep(HEALTHY_WAIT_RECHECK_INTERVAL)
|
@@ -105,8 +111,8 @@ class Deployment
|
|
105
111
|
end
|
106
112
|
|
107
113
|
def cancel(deploymentId,force=false)
|
108
|
-
raise
|
109
|
-
if (running_for_deployment_id?
|
114
|
+
raise ArgumentError, "deploymentId must be specified to cancel deployment", caller if (deploymentId.empty?)
|
115
|
+
if (running_for_deployment_id?)
|
110
116
|
response = HttpUtil.delete(@url + MarathonDefaults::MARATHON_DEPLOYMENT_REST_PATH + deploymentId + "?force=#{force}")
|
111
117
|
$LOG.debug("Cancellation response [#{response.code}] => " + JSON.pretty_generate(JSON.parse(response.body)))
|
112
118
|
end
|
@@ -266,4 +272,5 @@ class Deployment
|
|
266
272
|
return payload.find_all { |d| d['affectedApps'].include?('/' + @application.id) }
|
267
273
|
end
|
268
274
|
|
275
|
+
end
|
269
276
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'marathon_deploy/error'
|
2
2
|
|
3
|
-
module
|
3
|
+
module MarathonDeploy
|
4
|
+
module Macro
|
4
5
|
|
5
6
|
MACRO_BOUNDARY = '%%'
|
6
7
|
|
@@ -25,13 +26,13 @@ module Macro
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def self.get_undefined_macros(macros)
|
28
|
-
raise ArgumentError, "
|
29
|
+
raise ArgumentError, "Argument must be an array", caller if (!macros.class == Array)
|
29
30
|
undefined = Array.new
|
30
31
|
return macros.select { |m| !has_env?(m) }
|
31
32
|
end
|
32
33
|
|
33
34
|
def self.has_env?(macro)
|
34
|
-
raise ArgumentError, "
|
35
|
+
raise ArgumentError, "Argument must be a String", caller if (!macro.class == String)
|
35
36
|
env_name = strip(macro)
|
36
37
|
if (env_defined?(strip(env_name)))
|
37
38
|
return true
|
@@ -46,10 +47,11 @@ module Macro
|
|
46
47
|
|
47
48
|
def self.expand_macros(data)
|
48
49
|
processed = ""
|
49
|
-
macros = get_macros(data)
|
50
|
+
macros = get_macros(data).uniq
|
51
|
+
$LOG.debug("Macros found in deploy file: #{macros.join(',')}")
|
50
52
|
undefined = get_undefined_macros(macros)
|
51
53
|
if (!undefined.empty?)
|
52
|
-
raise Error::UndefinedMacroError, "
|
54
|
+
raise Error::UndefinedMacroError, "Macros found in deploy file without defined environment variables: #{undefined.join(',')}", caller
|
53
55
|
end
|
54
56
|
|
55
57
|
data.each do |line|
|
@@ -68,4 +70,5 @@ module Macro
|
|
68
70
|
|
69
71
|
private_class_method :get_macros, :get_env_keys, :strip, :has_env?, :get_undefined_macros, :env_defined?, :expand_macros
|
70
72
|
|
73
|
+
end
|
71
74
|
end
|
@@ -3,7 +3,8 @@ require 'marathon_deploy/deployment'
|
|
3
3
|
require 'marathon_deploy/utils'
|
4
4
|
require 'marathon_deploy/marathon_defaults'
|
5
5
|
|
6
|
-
|
6
|
+
module MarathonDeploy
|
7
|
+
class MarathonClient
|
7
8
|
|
8
9
|
attr_reader :marathon_url, :options
|
9
10
|
attr_accessor :application
|
@@ -33,7 +34,7 @@ class MarathonClient
|
|
33
34
|
begin
|
34
35
|
deployment.wait_for_application("Deployment already running for application #{application.id}")
|
35
36
|
rescue Timeout::Error => e
|
36
|
-
raise Timeout::Error, "Timed out after #{deployment.timeout}s waiting for existing deployment of #{application.id} to finish. Check marathon #{@marathon_url + '/#deployments'} for stuck deployments!", caller
|
37
|
+
raise Timeout::Error, "Timed out after #{deployment.timeout}s waiting for existing deployment of #{application.id} to finish. Check marathon ui #{@marathon_url + '/#deployments'} for stuck deployments!", caller
|
37
38
|
end
|
38
39
|
|
39
40
|
$LOG.info("Starting deployment of #{application.id}")
|
@@ -72,8 +73,9 @@ class MarathonClient
|
|
72
73
|
begin
|
73
74
|
deployment.wait_until_healthy
|
74
75
|
rescue Timeout::Error => e
|
75
|
-
raise Timeout::Error, "Timed out after #{deployment.healthcheck_timeout}s waiting for #{application.instances} instances of #{application.id} to become healthy", caller
|
76
|
+
raise Timeout::Error, "Timed out after #{deployment.healthcheck_timeout}s waiting for #{application.instances} instances of #{application.id} to become healthy. Check marathon ui #{@marathon_url + '/#deployments'} for more information.", caller
|
76
77
|
end
|
77
|
-
|
78
|
+
end
|
79
|
+
|
78
80
|
end
|
79
81
|
end
|
@@ -2,15 +2,16 @@ require 'marathon_deploy/utils'
|
|
2
2
|
require 'marathon_deploy/error'
|
3
3
|
require 'logger'
|
4
4
|
|
5
|
-
module
|
5
|
+
module MarathonDeploy
|
6
|
+
module MarathonDefaults
|
6
7
|
|
7
8
|
DEPLOYMENT_RECHECK_INTERVAL = 3
|
8
9
|
DEPLOYMENT_TIMEOUT = 300
|
9
|
-
HEALTHY_WAIT_TIMEOUT = 300
|
10
|
+
HEALTHY_WAIT_TIMEOUT = 10 #300
|
10
11
|
HEALTHY_WAIT_RECHECK_INTERVAL = 3
|
11
12
|
PRODUCTION_ENVIRONMENT_NAME = 'PRODUCTION'
|
12
13
|
DEFAULT_ENVIRONMENT_NAME = 'INTEGRATION'
|
13
|
-
DEFAULT_PREPRODUCTION_MARATHON_ENDPOINTS = ['http://
|
14
|
+
DEFAULT_PREPRODUCTION_MARATHON_ENDPOINTS = ['http://localhost:8080']
|
14
15
|
DEFAULT_PRODUCTION_MARATHON_ENDPOINTS = ['http://paasmaster46-1.mobile.rz:8080']
|
15
16
|
DEFAULT_DEPLOYFILE = 'deploy.yaml'
|
16
17
|
DEFAULT_LOGFILE = false
|
@@ -30,10 +31,7 @@ module MarathonDefaults
|
|
30
31
|
:JAVA_XMX => "128m"
|
31
32
|
}
|
32
33
|
|
33
|
-
@@required_marathon_env_variables = %w[
|
34
|
-
DATACENTER_NUMBER
|
35
|
-
APPLICATION_NAME
|
36
|
-
]
|
34
|
+
@@required_marathon_env_variables = %w[]
|
37
35
|
|
38
36
|
#@@required_marathon_attributes = %w[id env container healthChecks args storeUrls].map(&:to_sym)
|
39
37
|
@@required_marathon_attributes = %w[id].map(&:to_sym)
|
@@ -80,4 +78,5 @@ module MarathonDefaults
|
|
80
78
|
return json
|
81
79
|
end
|
82
80
|
|
81
|
+
end
|
83
82
|
end
|
@@ -2,7 +2,8 @@ require 'yaml'
|
|
2
2
|
require 'json'
|
3
3
|
require 'marathon_deploy/macro'
|
4
4
|
|
5
|
-
module
|
5
|
+
module MarathonDeploy
|
6
|
+
module YamlJson
|
6
7
|
|
7
8
|
def self.yaml2json(filename, process_macros=true)
|
8
9
|
if (process_macros)
|
@@ -42,4 +43,5 @@ module YamlJson
|
|
42
43
|
return JSON.parse(data)
|
43
44
|
end
|
44
45
|
|
46
|
+
end
|
45
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marathon_deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Colby
|
@@ -70,7 +70,6 @@ description: Pushes a yaml or json file to the Marathon API.
|
|
70
70
|
email:
|
71
71
|
- jcolby@team.mobile.de
|
72
72
|
executables:
|
73
|
-
- deploy
|
74
73
|
- deploy.rb
|
75
74
|
- json2yaml.rb
|
76
75
|
extensions: []
|
@@ -83,7 +82,6 @@ files:
|
|
83
82
|
- README.md
|
84
83
|
- Rakefile
|
85
84
|
- TODO
|
86
|
-
- bin/deploy
|
87
85
|
- bin/deploy.rb
|
88
86
|
- bin/json2yaml.rb
|
89
87
|
- examples/deploy.json
|
@@ -129,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
127
|
version: '0'
|
130
128
|
requirements: []
|
131
129
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.4.
|
130
|
+
rubygems_version: 2.4.5
|
133
131
|
signing_key:
|
134
132
|
specification_version: 4
|
135
133
|
summary: Mesos/Marathon deployment tool.
|
data/bin/deploy
DELETED