marathon_deploy 0.0.5 → 0.1.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: d36ab0f56e7333a322797bde9b0be22f8bca0a49
4
- data.tar.gz: b3d652b3ae236cba2d35e6df4a8f0b563a07a28c
3
+ metadata.gz: 0b3213c4005fdc4ffb221d60f443a949c60f1c0c
4
+ data.tar.gz: 30b2c173fa0ae0800f607314efdb0ad2b73b7dc1
5
5
  SHA512:
6
- metadata.gz: 9a04bbbfcc103ef9d643a4c2a683f8e890e296f48de343bea492a1e72879552899d27fa608d36dde5ddf87c57e6b2408c338fd0db041d38fcb09488a5c9a2542
7
- data.tar.gz: 4bac8e201eb7527a525e82d57aa6a20a7ed0f5a1c9952392ff8d8173dd2aad5b7e66a1a3982e3a59329b356ee130b79b5653edb554bf576d0749a7da3ab54600
6
+ metadata.gz: 05cf5e91997520dfae47244112b20042cb9aa108e1859bc07b567940ca0b612286eeedd1a49b5e38b44f4478382420016483ea30869735e6c26c4a585b6af69e
7
+ data.tar.gz: 924f980722aadb76eb761ebf827636a9453627172654b6bf102f99ebf57fdc2a81cd97592e43c57d2d4409539cce611f0f3c531c94d50020f768dd4511557739
data/TODO CHANGED
@@ -4,8 +4,9 @@
4
4
  DONE datacenter handling, iterate
5
5
  DONE deployment status polling
6
6
  - config assembler / generate properties script ?
7
- - read in ENVIRONMENT VARIABLES WITH MARATHON_ and add to deployment json ?
7
+ DESCOPED read in ENVIRONMENT VARIABLES WITH MARATHON_ and add to deployment json ?
8
8
  - inject / replce minimumHealthCapacity is 1, maximumOverCapacity is 1
9
9
  DESCOPED custom external ports (must be provided in json)
10
- - read macros %NAME% from yaml/json and verify they are defined
11
- - gem structure / packaging / metadata
10
+ DONE read macros %NAME% from yaml/json and verify they are defined
11
+ DONE gem structure / packaging / metadata
12
+ DONE implement noop
data/bin/deploy.rb CHANGED
@@ -12,11 +12,13 @@ require 'logger'
12
12
  options = {}
13
13
 
14
14
  # DEFAULTS
15
- options[:deployfile] = MarathonDeploy::MarathonDefaults::DEFAULT_DEPLOYFILE
15
+ DEFAULT_DEPLOYFILE = MarathonDeploy::MarathonDefaults::DEFAULT_DEPLOYFILE
16
16
  options[:debug] = MarathonDeploy::MarathonDefaults::DEFAULT_LOGLEVEL
17
17
  options[:environment] = MarathonDeploy::MarathonDefaults::DEFAULT_ENVIRONMENT_NAME
18
18
  options[:marathon_endpoints] = MarathonDeploy::MarathonDefaults::DEFAULT_PREPRODUCTION_MARATHON_ENDPOINTS
19
19
  options[:logfile] = MarathonDeploy::MarathonDefaults::DEFAULT_LOGFILE
20
+ options[:force] = MarathonDeploy::MarathonDefaults::DEFAULT_FORCE_DEPLOY
21
+ options[:noop] = MarathonDeploy::MarathonDefaults::DEFAULT_NOOP
20
22
 
21
23
  OptionParser.new do |opts|
22
24
  opts.banner = "Usage: #{$0} [options]"
@@ -39,10 +41,15 @@ OptionParser.new do |opts|
39
41
  exit
40
42
  end
41
43
 
42
- opts.on("-f", "--file DEPLOYFILE" ,"Deploy file with json or yaml file extension. Default: #{options[:deployfile]}") do |f|
43
- options[:deployfile] = f
44
+ opts.on("-f", "--force", "Force deployment when sending same deploy JSON to Marathon") do |f|
45
+ options[:force] = true
44
46
  end
45
47
 
48
+ opts.on("-n", "--noop", "No action. Just display what would be performed.") do |f|
49
+ options[:noop] = true
50
+ end
51
+
52
+
46
53
  opts.on("-e", "--environment ENVIRONMENT", "Default: #{options[:environment]}" ) do |e|
47
54
  options[:environment] = e
48
55
  end
@@ -51,14 +58,28 @@ OptionParser.new do |opts|
51
58
  puts opts
52
59
  exit
53
60
  end
61
+
54
62
  end.parse!
55
63
 
64
+ abort("Ambiguous arguments: #{ARGV.join(',')}. Only one deploy file argument may be passed.") if (ARGV.length > 1)
65
+
66
+ argfile = ARGV.pop
67
+
68
+ if (!argfile.nil?)
69
+ abort("Deploy file \'#{argfile}\' does not exist!") unless(File.file?(argfile))
70
+ deployfile = argfile
71
+ elsif (File.file?(DEFAULT_DEPLOYFILE))
72
+ deployfile = DEFAULT_DEPLOYFILE
73
+ else
74
+ abort("No deploy file argument provided and default \'#{DEFAULT_DEPLOYFILE}\' does not exist in current directory \'#{Dir.pwd}\'")
75
+ end
76
+
56
77
  $LOG = options[:logfile] ? Logger.new(options[:logfile]) : Logger.new(STDOUT)
57
78
  $LOG.level = options[:debug]
58
79
 
59
- deployfile = options[:deployfile]
80
+ noop = options[:noop]
60
81
  environment = MarathonDeploy::Environment.new(options[:environment])
61
-
82
+
62
83
  marathon_endpoints = Array.new
63
84
  if (options[:marathon_endpoints].nil?)
64
85
  if (environment.is_production?)
@@ -71,11 +92,15 @@ else
71
92
  end
72
93
 
73
94
  begin
74
- application = MarathonDeploy::Application.new(deployfile)
95
+ application = MarathonDeploy::Application.new(:deployfile => deployfile, :force => options[:force])
75
96
  rescue MarathonDeploy::Error::IOError, MarathonDeploy::Error::UndefinedMacroError,MarathonDeploy::Error::MissingMarathonAttributesError,MarathonDeploy::Error::UnsupportedFileExtension => e
76
97
  $LOG.debug(e)
77
98
  $LOG.error(e.message)
78
99
  exit!
100
+ rescue JSON::ParserError => e
101
+ $LOG.debug(e)
102
+ $LOG.error("\'#{deployfile}\' seems to be invalid JSON. Please verify the file.")
103
+ exit!
79
104
  end
80
105
 
81
106
  begin
@@ -89,13 +114,16 @@ if (!environment.is_production?)
89
114
  application.overlay_preproduction_settings
90
115
  end
91
116
 
92
- puts "#" * 100
117
+ display_msg = " MARATHON JSON DEPLOYMENT INSTRUCTIONS "
118
+ puts '#' * 50 + display_msg + '#' * 50
93
119
  puts JSON.pretty_generate(application.json)
94
- puts "#" * 100
120
+ puts "#" * (100 + display_msg.length)
95
121
 
96
- # deploy to each endpoint
122
+ # deploy to each marathon endpoint
97
123
  marathon_endpoints.each do |marathon_url|
98
124
  begin
125
+ puts "[NOOP] Sending JSON deployment instructions to marathon endpoint: #{marathon_url}." if (noop)
126
+ next if (noop)
99
127
  client = MarathonDeploy::MarathonClient.new(marathon_url)
100
128
  client.application = application
101
129
  client.deploy
@@ -111,3 +139,5 @@ marathon_endpoints.each do |marathon_url|
111
139
  end
112
140
 
113
141
  end
142
+
143
+ puts "[NOOP] Deployment completed." if (noop)
@@ -14,7 +14,7 @@ env:
14
14
  SERVICE_8009_TAGS: ajp
15
15
  ANOTHER_MACRO_TEST: %%SPECIAL_PROPERTY%%
16
16
  id: content-webapp
17
- instances: 6
17
+ instances: 1
18
18
  mem: 32
19
19
  uris: []
20
20
  healthChecks:
@@ -10,10 +10,16 @@ module MarathonDeploy
10
10
  attr_reader :json, :id
11
11
  attr_accessor :envs
12
12
 
13
- def initialize(deployfile)
13
+ def initialize(options={})
14
+ default_options = {
15
+ :force => false,
16
+ :deployfile => 'deploy.yaml'
17
+ }
18
+ options = default_options.merge!(options)
19
+ deployfile = options[:deployfile]
14
20
 
15
21
  if (!File.exist?(File.join(Dir.pwd,deployfile)))
16
- message = "#{deployfile} not found in current directory #{File.join(Dir.pwd)}"
22
+ message = "\'#{deployfile}\' not found in current directory #{File.join(Dir.pwd)}"
17
23
  raise Error::IOError, message, caller
18
24
  end
19
25
 
@@ -43,8 +49,9 @@ module MarathonDeploy
43
49
  end
44
50
 
45
51
  @deployfile = deployfile
46
- @json = Utils.deep_symbolize(@json)
47
- add_identifier
52
+ @json = Utils.deep_symbolize(@json)
53
+
54
+ add_identifier if (options[:force])
48
55
 
49
56
  end
50
57
 
@@ -48,7 +48,7 @@ module MarathonDeploy
48
48
  else
49
49
  response = deployment.create_app
50
50
  end
51
-
51
+
52
52
  if ((300..999).include?(response.code.to_i))
53
53
  $LOG.error("Deployment response body => " + JSON.pretty_generate(JSON.parse(response.body)))
54
54
  raise Error::DeploymentError, "Deployment returned response code #{response.code}", caller
@@ -18,6 +18,8 @@ module MarathonDeploy
18
18
  DEFAULT_LOGLEVEL = Logger::INFO
19
19
  MARATHON_APPS_REST_PATH = '/v2/apps/'
20
20
  MARATHON_DEPLOYMENT_REST_PATH = '/v2/deployments/'
21
+ DEFAULT_FORCE_DEPLOY = false
22
+ DEFAULT_NOOP = false
21
23
 
22
24
  @@preproduction_override = {
23
25
  :instances => 5,
@@ -1,3 +1,3 @@
1
1
  module MarathonDeploy
2
- VERSION = "0.0.5"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marathon_deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Colby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-22 00:00:00.000000000 Z
11
+ date: 2015-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logger
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  requirements: []
132
132
  rubyforge_project:
133
- rubygems_version: 2.4.6
133
+ rubygems_version: 2.4.5
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Mesos/Marathon deployment tool.