marathon_deploy 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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