gantree 0.4.8 → 0.4.9.2
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/Guardfile +1 -1
- data/lib/gantree.rb +3 -1
- data/lib/gantree/base.rb +60 -0
- data/lib/gantree/cfn/beanstalk.rb +1 -2
- data/lib/gantree/cli.rb +36 -23
- data/lib/gantree/cli/help.rb +12 -0
- data/lib/gantree/create.rb +115 -0
- data/lib/gantree/delete.rb +27 -0
- data/lib/gantree/deploy.rb +30 -14
- data/lib/gantree/update.rb +69 -0
- data/lib/gantree/version.rb +1 -1
- data/spec/lib/gantree/cli_spec.rb +7 -10
- data/spec/lib/gantree/create_spec.rb +21 -0
- data/spec/lib/gantree/delete_spec.rb +20 -0
- data/spec/lib/gantree/update_spec.rb +40 -0
- metadata +11 -5
- data/lib/gantree/stack.rb +0 -227
- data/spec/lib/gantree/stack_spec.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe5aa1695b2783cb4be4a352319a6edbab122367
|
4
|
+
data.tar.gz: 9c39abc22f8f72d27760890283770dc5985d6d0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ac5e7bbc6d05613ef8d7b2e8085e44cbbeb8015a66069c1085fc9b0d7c5c46bb231cb5b732876ac02f43a5e0f99e19a127a1b02e92766b2abb36dbfdac9304d
|
7
|
+
data.tar.gz: 572c16535102d78a285b8b84a50b2b616377ec9eae2dd7a90478906834de51cf428255cd8cfec0bd8c00e49d59166cdb9c91f4eafd0ce872952e9f4eff2b3bfa
|
data/.travis.yml
CHANGED
@@ -5,6 +5,7 @@ rvm:
|
|
5
5
|
before_script:
|
6
6
|
- echo "{"https://index.docker.io/v1/":{"auth":"$DOCKER_TOKEN","email":"$DOCKER_EMAIL"}"
|
7
7
|
> $HOME/.dockercfg
|
8
|
+
- echo "{'cfn_bucket' : 'br-templates', 'domain' : 'brenv.net'}" > $HOME/.gantreecfg
|
8
9
|
env:
|
9
10
|
global:
|
10
11
|
- secure: OoLMnBOcoXTPOimdyh4ju8yW2YpLBXEOdljN1gVQzjIIv24cQ0BxWAAktjExntkYAjnRpxzTKK5ZkWadXm8NK7TtzFU80padk+WYVzuE1Xngxw/OhS1Z6NYL8+D3ortSANqoOB6r/Z13Sb5XClYDWlj5/GGzf4AerY5xgh2nJQc=
|
data/Guardfile
CHANGED
@@ -3,7 +3,7 @@ guard :rspec, cmd: 'bundle exec rspec' do
|
|
3
3
|
watch(%r{^lib/(.+)\.rb$}) { "spec/cli_spec.rb" }
|
4
4
|
watch(%r{^lib/gantree/(.+)\.rb$}) { "spec/cli_spec.rb" }
|
5
5
|
watch('spec/spec_helper.rb') { "spec/gantree_spec.rb" }
|
6
|
-
watch(%r{^lib/gantree/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
6
|
+
watch(%r{^lib/gantree/(.+)\.rb$}) { |m| "spec/lib/gantree/#{m[1]}_spec.rb" }
|
7
7
|
end
|
8
8
|
|
9
9
|
guard 'bundler' do
|
data/lib/gantree.rb
CHANGED
@@ -3,7 +3,9 @@ require "gantree/base"
|
|
3
3
|
require "gantree/version"
|
4
4
|
require "gantree/deploy"
|
5
5
|
require "gantree/init"
|
6
|
-
require "gantree/
|
6
|
+
require "gantree/delete"
|
7
|
+
require "gantree/update"
|
8
|
+
require "gantree/create"
|
7
9
|
require "gantree/app"
|
8
10
|
require "gantree/docker"
|
9
11
|
|
data/lib/gantree/base.rb
CHANGED
@@ -26,12 +26,72 @@ module Gantree
|
|
26
26
|
@eb ||= AWS::ElasticBeanstalk::Client.new
|
27
27
|
end
|
28
28
|
|
29
|
+
def cfm
|
30
|
+
@cfm ||= AWS::CloudFormation.new
|
31
|
+
end
|
32
|
+
|
33
|
+
|
29
34
|
def tag
|
30
35
|
origin = `git config --get remote.origin.url`.match(":(.*)\/")[1]
|
31
36
|
branch = `git rev-parse --abbrev-ref HEAD`.strip
|
32
37
|
hash = `git rev-parse --verify --short #{branch}`.strip
|
33
38
|
"#{origin}-#{branch}-#{hash}"
|
34
39
|
end
|
40
|
+
|
41
|
+
def create_default_env
|
42
|
+
tags = @options[:stack_name].split("-")
|
43
|
+
if tags.length == 3
|
44
|
+
env = [tags[1],tags[0],"app",tags[2]].join('-')
|
45
|
+
else
|
46
|
+
raise "Please Set Envinronment Name with -e"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def env_type
|
51
|
+
if @options[:env].include?("prod")
|
52
|
+
"prod"
|
53
|
+
elsif @options[:env].include?("stag")
|
54
|
+
"stag"
|
55
|
+
else
|
56
|
+
""
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_latest_docker_solution
|
61
|
+
result = eb.list_available_solution_stacks
|
62
|
+
solutions = result[:solution_stacks]
|
63
|
+
docker_solutions = solutions.select { |s| s.include? "running Docker"}
|
64
|
+
docker_solutions.first
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def escape_characters_in_string(string)
|
69
|
+
pattern = /(\'|\"|\.|\*|\/|\-|\\)/
|
70
|
+
string.gsub(pattern){|match|"\\" + match} # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that).
|
71
|
+
end
|
72
|
+
|
73
|
+
def upload_templates
|
74
|
+
check_template_bucket
|
75
|
+
@templates.each do |template|
|
76
|
+
filename = "cfn/#{@options[:stack_name]}-#{template}.cfn.json"
|
77
|
+
key = File.basename(filename)
|
78
|
+
s3.buckets["#{@options[:cfn_bucket]}/#{@options[:stack_name]}"].objects[key].write(:file => filename)
|
79
|
+
end
|
80
|
+
puts "templates uploaded"
|
81
|
+
end
|
82
|
+
|
83
|
+
def check_template_bucket
|
84
|
+
puts "DEBUG: #{@options[:cfn_bucket]}"
|
85
|
+
raise "Set Bucket to Upload Templates with --cfn-bucket" unless @options[:cfn_bucket]
|
86
|
+
bucket_name = "#{@options[:cfn_bucket]}/#{@options[:stack_name]}"
|
87
|
+
if s3.buckets[bucket_name].exists?
|
88
|
+
puts "uploading cfn templates to #{@options[:cfn_bucket]}/#{@options[:stack_name]}"
|
89
|
+
else
|
90
|
+
puts "creating bucket #{@options[:cfn_bucket]}/#{@options[:stack_name]} to upload templates"
|
91
|
+
s3.buckets.create(bucket_name)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
35
95
|
end
|
36
96
|
end
|
37
97
|
|
@@ -2,8 +2,7 @@ class BeanstalkTemplate
|
|
2
2
|
|
3
3
|
def initialize params
|
4
4
|
@stack_name = params[:stack_name]
|
5
|
-
@docker_version = params[:
|
6
|
-
@docker_version ||= "64bit Amazon Linux 2014.09 v1.0.10 running Docker 1.3.2"
|
5
|
+
@docker_version = params[:solution]
|
7
6
|
@size = params[:instance_size]
|
8
7
|
@rds = params[:rds]
|
9
8
|
@env = params[:env]
|
data/lib/gantree/cli.rb
CHANGED
@@ -6,16 +6,16 @@ require 'gantree/cli/help'
|
|
6
6
|
module Gantree
|
7
7
|
class CLI < Thor
|
8
8
|
|
9
|
-
class_option :dry_run, :aliases => "-d", :desc => "dry run mode", :default => false
|
9
|
+
class_option :dry_run, :aliases => "-d", :desc => "dry run mode", :default => false, :type => :boolean
|
10
10
|
|
11
11
|
desc "deploy APP", "deploy specified APP"
|
12
12
|
long_desc Help.deploy
|
13
13
|
option :branch, :desc => 'branch to deploy'
|
14
|
-
|
15
|
-
|
14
|
+
option :tag, :aliases => "-t", :desc => "set docker tag to deploy"
|
15
|
+
option :ext, :aliases => "-x", :desc => "ebextensions folder/repo"
|
16
16
|
option :silent, :aliases => "-s", :desc => "mute notifications"
|
17
17
|
option :image_path, :aliases => "-i", :desc => "docker hub image path ex. (bleacher/cms | quay.io/bleacherreport/cms)"
|
18
|
-
option :autodetect_app_role, :desc => "use naming convention to determin role"
|
18
|
+
option :autodetect_app_role, :desc => "use naming convention to determin role (true|false)", :type => :boolean, :default => true
|
19
19
|
def deploy name
|
20
20
|
Gantree::Deploy.new(name, merge_defaults(options)).run
|
21
21
|
end
|
@@ -31,28 +31,31 @@ module Gantree
|
|
31
31
|
|
32
32
|
desc "create APP", "create a cfn stack"
|
33
33
|
long_desc Help.create
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
option :
|
38
|
-
option :
|
39
|
-
option :
|
34
|
+
option :cfn_bucket, :desc => "s3 bucket to store cfn templates"
|
35
|
+
option :domain, :desc => "route53 domain"
|
36
|
+
option :env, :aliases => "-e", :desc => "(optional) environment name"
|
37
|
+
option :instance_size, :aliases => "-i", :desc => "(optional) set instance size", :default => "m3.medium"
|
38
|
+
option :rds, :aliases => "-r", :desc => "(optional) set database type [pg,mysql]"
|
39
|
+
option :solution, :aliases => "-s", :desc => "change solution stack"
|
40
|
+
option :dupe, :alias => "-d", :desc => "copy an existing template into a new template"
|
41
|
+
option :local, :alias => "-l", :desc => "use a local cfn nested template"
|
40
42
|
def create app
|
41
|
-
Gantree::
|
43
|
+
Gantree::Create.new(app, merge_defaults(options)).run
|
42
44
|
end
|
43
45
|
|
44
46
|
desc "update APP", "update a cfn stack"
|
45
47
|
long_desc Help.update
|
48
|
+
option :cfn_bucket, :desc => "s3 bucket to store cfn templates"
|
46
49
|
option :role, :aliases => "-r", :desc => "add an app role (worker|listner|scheduler)"
|
47
50
|
option :solution, :aliases => "-s", :desc => "change solution stack"
|
48
51
|
def update app
|
49
|
-
Gantree::
|
52
|
+
Gantree::Update.new(app, merge_defaults(options)).run
|
50
53
|
end
|
51
54
|
|
52
55
|
desc "delete APP", "delete a cfn stack"
|
53
|
-
option :force, :desc => "do not prompt"
|
56
|
+
option :force, :desc => "do not prompt", :default => false
|
54
57
|
def delete app
|
55
|
-
Gantree::
|
58
|
+
Gantree::Delete.new(app, merge_defaults(options)).run
|
56
59
|
end
|
57
60
|
|
58
61
|
desc "restart APP", "restart an eb app"
|
@@ -88,7 +91,7 @@ module Gantree
|
|
88
91
|
option :tag, :aliases => "-t", :desc => "set docker tag to deploy", :default => Gantree::Base.new.tag
|
89
92
|
option :ext, :aliases => "-x", :desc => "ebextensions folder/repo"
|
90
93
|
option :silent, :aliases => "-s", :desc => "mute notifications"
|
91
|
-
option :autodetect_app_role, :desc => "use naming convention to determin role"
|
94
|
+
option :autodetect_app_role, :desc => "use naming convention to determin role (true|flase)", :type => :boolean
|
92
95
|
option :image_path, :aliases => "-i", :desc => "hub image path ex. (bleacher/cms | quay.io/bleacherreport/cms)"
|
93
96
|
option :hush, :desc => "quite puts messages", :default => true
|
94
97
|
def ship server
|
@@ -107,14 +110,24 @@ module Gantree
|
|
107
110
|
protected
|
108
111
|
|
109
112
|
def merge_defaults(options={})
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
home_cfg = "#{ENV['HOME']}/.gantreecfg"
|
114
|
+
local_cfg = ".gantreecfg"
|
115
|
+
if File.exist?(home_cfg) && File.exist?(local_cfg)
|
116
|
+
home_opts = JSON.parse(File.open(home_cfg).read)
|
117
|
+
local_opts = JSON.parse(File.open(local_cfg).read)
|
118
|
+
defaults = home_opts.merge(local_opts)
|
119
|
+
hash = defaults.merge(options)
|
120
|
+
elsif File.exist?(local_cfg)
|
121
|
+
defaults = JSON.parse(File.open(local_cfg).read)
|
122
|
+
hash = defaults.merge(options)
|
123
|
+
elsif File.exist?(home_cfg)
|
124
|
+
defaults = JSON.parse(File.open(home_cfg).read)
|
125
|
+
hash = defaults.merge(options)
|
126
|
+
else
|
127
|
+
hash = options
|
128
|
+
end
|
129
|
+
Hash[hash.map{ |k, v| [k.to_sym, v] }]
|
130
|
+
end
|
118
131
|
end
|
119
132
|
end
|
120
133
|
|
data/lib/gantree/cli/help.rb
CHANGED
@@ -58,13 +58,17 @@ EOL
|
|
58
58
|
Examples:
|
59
59
|
|
60
60
|
# Update a cloudformation stack
|
61
|
+
|
61
62
|
$ gantree update linguist-stag-s1
|
62
63
|
|
63
64
|
# Add an app role to an existing stack
|
65
|
+
|
64
66
|
$ gantree update linguist-stag-s1 -r worker
|
65
67
|
|
66
68
|
# Update docker solution starck version
|
69
|
+
|
67
70
|
$ gantree update linguist-stag-s1 -s latest
|
71
|
+
|
68
72
|
$ gantree update linguist-stag-s1 -s "64bit Amazon Linux 2014.09 v1.0.11 running Docker 1.3.3"
|
69
73
|
EOL
|
70
74
|
end
|
@@ -76,12 +80,15 @@ Builds and tags a docker application.
|
|
76
80
|
Examples:
|
77
81
|
|
78
82
|
# Automatically tag a build
|
83
|
+
|
79
84
|
$ gantree build
|
80
85
|
|
81
86
|
# Add custom tag to a build
|
87
|
+
|
82
88
|
$ gantree build -t deploy
|
83
89
|
|
84
90
|
# Override image path to point to another hub
|
91
|
+
|
85
92
|
$ gantree build -i quay.io/bleacherreport/cms
|
86
93
|
|
87
94
|
EOL
|
@@ -94,12 +101,15 @@ Push docker image tag to hub
|
|
94
101
|
Examples:
|
95
102
|
|
96
103
|
# Push automatically tagged build
|
104
|
+
|
97
105
|
$ gantree push
|
98
106
|
|
99
107
|
# Push custom tagged build
|
108
|
+
|
100
109
|
$ gantree push -t deploy
|
101
110
|
|
102
111
|
# Push to another hub/acocunt/repo
|
112
|
+
|
103
113
|
$ gantree push -i quay.io/bleacherreport/cms
|
104
114
|
EOL
|
105
115
|
end
|
@@ -111,9 +121,11 @@ build, push and deploy docker image to elastic beanstalk
|
|
111
121
|
Examples:
|
112
122
|
|
113
123
|
# Automatically tag a build, push that build and deploy to elastic beanstalk
|
124
|
+
|
114
125
|
$ gantree ship cms-stag-s1
|
115
126
|
|
116
127
|
# Override defaults
|
128
|
+
|
117
129
|
$ gantree ship -i bleacher/cms -x "git@github.com:br/.ebextensions.git:master" cms-stag-s1
|
118
130
|
|
119
131
|
$ gantree ship -i bleacher/cms -t built -x "git@github.com:br/.ebextensions.git:master" cms-stag-s1
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'cloudformation-ruby-dsl'
|
2
|
+
require 'highline/import'
|
3
|
+
require_relative 'cfn/master'
|
4
|
+
require_relative 'cfn/beanstalk'
|
5
|
+
require_relative 'cfn/resources'
|
6
|
+
|
7
|
+
module Gantree
|
8
|
+
class Create < Base
|
9
|
+
attr_reader :env, :stack_name
|
10
|
+
|
11
|
+
def initialize stack_name,options
|
12
|
+
check_credentials
|
13
|
+
set_aws_keys
|
14
|
+
|
15
|
+
@requirements = "#!/usr/bin/env ruby
|
16
|
+
require 'cloudformation-ruby-dsl/cfntemplate'
|
17
|
+
require 'cloudformation-ruby-dsl/spotprice'
|
18
|
+
require 'cloudformation-ruby-dsl/table'"
|
19
|
+
|
20
|
+
additional_options = {
|
21
|
+
requirements: @requirements,
|
22
|
+
stack_name: stack_name,
|
23
|
+
stack_hash: (0...8).map { (65 + rand(26)).chr }.join
|
24
|
+
}
|
25
|
+
@options = options.merge(additional_options)
|
26
|
+
@options[:env] ||= create_default_env
|
27
|
+
@options[:env_type] ||= env_type
|
28
|
+
@options[:solution] ||= get_latest_docker_solution
|
29
|
+
@templates = ['master','resources','beanstalk']
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
@options[:rds_enabled] = rds_enabled? if @options[:rds]
|
34
|
+
print_options
|
35
|
+
create_cfn_if_needed
|
36
|
+
create_all_templates unless @options[:local]
|
37
|
+
upload_templates unless @options[:dry_run]
|
38
|
+
create_aws_cfn_stack unless @options[:dry_run]
|
39
|
+
end
|
40
|
+
|
41
|
+
def stack_template
|
42
|
+
s3.buckets["#{@options[:cfn_bucket]}/#{@options[:stack_name]}"].objects["#{@options[:stack_name]}-master.cfn.json"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_cfn_if_needed
|
46
|
+
Dir.mkdir 'cfn' unless File.directory?("cfn")
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_all_templates
|
50
|
+
@options[:dupe] ? duplicate_stack : generate_all_templates
|
51
|
+
end
|
52
|
+
|
53
|
+
def generate_all_templates
|
54
|
+
puts "Generating templates from gantree"
|
55
|
+
generate("master", MasterTemplate.new(@options).create)
|
56
|
+
generate("beanstalk", BeanstalkTemplate.new(@options).create)
|
57
|
+
generate("resources", ResourcesTemplate.new(@options).create)
|
58
|
+
end
|
59
|
+
|
60
|
+
def duplicate_stack
|
61
|
+
puts "Duplicating cluster"
|
62
|
+
orgin_stack_name = @options[:dupe]
|
63
|
+
@templates.each do |template|
|
64
|
+
FileUtils.cp("cfn/#{orgin_stack_name}-#{template}.cfn.json", "cfn/#{@options[:stack_name]}-#{template}.cfn.json")
|
65
|
+
file = IO.read("cfn/#{@options[:stack_name]}-#{template}.cfn.json")
|
66
|
+
file.gsub!(/#{escape_characters_in_string(orgin_stack_name)}/, @options[:stack_name])
|
67
|
+
replace_env_references(file)
|
68
|
+
IO.write("cfn/#{@options[:stack_name]}-#{template}.cfn.json",file)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def replace_env_references file
|
73
|
+
origin_tags = @options[:dupe].split("-")
|
74
|
+
new_tags = @options[:stack_name].split("-")
|
75
|
+
possible_roles = ["app","worker","listener","djay","scheduler","sched","list","lisnr","listnr"]
|
76
|
+
possible_roles.each do |role|
|
77
|
+
origin_env = [origin_tags[1],origin_tags[0],role,origin_tags[2]].join('-')
|
78
|
+
new_env = [new_tags[1],new_tags[0],role,new_tags[2]].join('-')
|
79
|
+
file.gsub!(/#{escape_characters_in_string(origin_env)}/, new_env)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def generate(template_name, template)
|
84
|
+
IO.write("cfn/#{template_name}.rb", template)
|
85
|
+
json = `ruby cfn/#{template_name}.rb expand`
|
86
|
+
Dir.mkdir 'cfn' rescue Errno::ENOENT
|
87
|
+
template_file_name = "#{@options[:stack_name]}-#{template_name}.cfn.json"
|
88
|
+
IO.write("cfn/#{template_file_name}", json)
|
89
|
+
puts "Created #{template_file_name} in the cfn directory"
|
90
|
+
FileUtils.rm("cfn/#{template_name}.rb")
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_aws_cfn_stack
|
94
|
+
puts "Creating stack on aws..."
|
95
|
+
stack = cfm.stacks.create(@options[:stack_name], stack_template, {
|
96
|
+
:disable_rollback => true,
|
97
|
+
:tags => [
|
98
|
+
{ key: "StackName", value: @options[:stack_name] },
|
99
|
+
]})
|
100
|
+
end
|
101
|
+
|
102
|
+
def rds_enabled?
|
103
|
+
if @options[:rds] == nil
|
104
|
+
puts "RDS is not enabled, no DB created"
|
105
|
+
false
|
106
|
+
elsif @options[:rds] == "pg" || @rds == "mysql"
|
107
|
+
puts "RDS is enabled, creating DB"
|
108
|
+
true
|
109
|
+
else
|
110
|
+
raise "The --rds option you passed is not supported please use 'pg' or 'mysql'"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module Gantree
|
5
|
+
class Delete < Base
|
6
|
+
|
7
|
+
def initialize stack_name,options
|
8
|
+
check_credentials
|
9
|
+
set_aws_keys
|
10
|
+
@stack_name = stack_name
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def run input=""
|
15
|
+
input = "y" if @options[:force]
|
16
|
+
input ||= ask "Are you sure? (y|n)"
|
17
|
+
if input == "y" || @options[:force]
|
18
|
+
puts "Deleting stack from aws"
|
19
|
+
return if @options[:dry_run]
|
20
|
+
puts "Deleted".green if cfm.stacks[@stack_name].delete
|
21
|
+
else
|
22
|
+
puts "canceling...".yellow
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
data/lib/gantree/deploy.rb
CHANGED
@@ -19,20 +19,11 @@ module Gantree
|
|
19
19
|
def run
|
20
20
|
if application?
|
21
21
|
puts "Found Application: #{@name}".green
|
22
|
-
environments = eb.describe_environments({ :application_name => @app })[:environments]
|
23
|
-
if
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
environments.each do |env|
|
28
|
-
envs << env[:environment_name]
|
29
|
-
end
|
30
|
-
puts "envs: #{envs}"
|
31
|
-
deploy(envs)
|
32
|
-
elsif environments.length == 1
|
33
|
-
env = environments.first[:environment_name]
|
34
|
-
puts "Found Environment: #{env}".green
|
35
|
-
deploy([env])
|
22
|
+
@environments = eb.describe_environments({ :application_name => @app })[:environments]
|
23
|
+
if multiple_environments?
|
24
|
+
deploy_to_all
|
25
|
+
elsif environment_found?
|
26
|
+
deploy_to_one
|
36
27
|
else
|
37
28
|
puts "ERROR: There are no environments in this application".red
|
38
29
|
exit 1
|
@@ -58,6 +49,31 @@ module Gantree
|
|
58
49
|
end
|
59
50
|
end
|
60
51
|
|
52
|
+
def multiple_environments?
|
53
|
+
@environments.length > 1 ? true : false
|
54
|
+
end
|
55
|
+
|
56
|
+
def environment_found?
|
57
|
+
@environments.length >=1 ? true : false
|
58
|
+
end
|
59
|
+
|
60
|
+
def deploy_to_all
|
61
|
+
puts "WARN: Deploying to All Environments in the Application: #{@name}".yellow
|
62
|
+
sleep 3
|
63
|
+
envs = []
|
64
|
+
@environments.each do |env|
|
65
|
+
envs << env[:environment_name]
|
66
|
+
end
|
67
|
+
puts "envs: #{envs}"
|
68
|
+
deploy(envs)
|
69
|
+
end
|
70
|
+
|
71
|
+
def deploy_to_one
|
72
|
+
env = @environments.first[:environment_name]
|
73
|
+
puts "Found Environment: #{env}".green
|
74
|
+
deploy([env])
|
75
|
+
end
|
76
|
+
|
61
77
|
def environment?
|
62
78
|
results = eb.describe_environments({ environment_names: ["#{@name}"]})[:environments]
|
63
79
|
if results.length == 0
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
module Gantree
|
4
|
+
class Update < Base
|
5
|
+
|
6
|
+
def initialize stack_name,options
|
7
|
+
check_credentials
|
8
|
+
set_aws_keys
|
9
|
+
@options = options
|
10
|
+
@options[:stack_name] = stack_name
|
11
|
+
@options[:env] ||= create_default_env
|
12
|
+
@options[:env_type] ||= env_type
|
13
|
+
@templates = ['master','resources','beanstalk']
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
puts "Updating stack from local cfn repo"
|
18
|
+
add_role @options[:role] if @options[:role]
|
19
|
+
change_solution_stack if @options[:solution]
|
20
|
+
return if @options[:dry_run]
|
21
|
+
upload_templates
|
22
|
+
puts "Stack Updated".green if cfm.stacks[@options[:stack_name]].update(:template => stack_template)
|
23
|
+
end
|
24
|
+
|
25
|
+
def stack_template
|
26
|
+
s3.buckets["#{@options[:cfn_bucket]}/#{@stack_name}"].objects["#{@stack_name}-master.cfn.json"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def change_solution_stack
|
30
|
+
beanstalk = JSON.parse(IO.read("cfn/#{@options[:stack_name]}-beanstalk.cfn.json"))
|
31
|
+
solution_stack = set_solution_stack
|
32
|
+
beanstalk["Resources"]["ConfigurationTemplate"]["Properties"]["SolutionStackName"] = solution_stack
|
33
|
+
beanstalk["Resources"]["ConfigurationTemplate"]["Properties"]["Description"] = solution_stack
|
34
|
+
IO.write("cfn/#{@options[:stack_name]}-beanstalk.cfn.json",JSON.pretty_generate(beanstalk))
|
35
|
+
puts "Updated solution to #{solution_stack}".green
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_solution_stack
|
39
|
+
@options[:solution] == "latest" ? get_latest_docker_solution : @options[:solution]
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_role name
|
43
|
+
env = @options[:env].sub('app', name)
|
44
|
+
beanstalk = JSON.parse(IO.read("cfn/#{@options[:stack_name]}-beanstalk.cfn.json"))
|
45
|
+
unless beanstalk["Resources"][name] then
|
46
|
+
role = {
|
47
|
+
"Type" => "AWS::ElasticBeanstalk::Environment",
|
48
|
+
"Properties"=> {
|
49
|
+
"ApplicationName" => "#{@options[:stack_name]}",
|
50
|
+
"EnvironmentName" => "#{env}",
|
51
|
+
"Description" => "#{name} Environment",
|
52
|
+
"TemplateName" => {
|
53
|
+
"Ref" => "ConfigurationTemplate"
|
54
|
+
},
|
55
|
+
"OptionSettings" => []
|
56
|
+
}
|
57
|
+
}
|
58
|
+
#puts JSON.pretty_generate role
|
59
|
+
beanstalk["Resources"]["#{name}".to_sym] = role
|
60
|
+
IO.write("cfn/#{@options[:stack_name]}-beanstalk.cfn.json", JSON.pretty_generate(beanstalk)) unless @options[:dry_run]
|
61
|
+
puts JSON.pretty_generate(beanstalk["Resources"].to_a.last)
|
62
|
+
puts "Added new #{name} role".green
|
63
|
+
else
|
64
|
+
puts "Role already exists".red
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
data/lib/gantree/version.rb
CHANGED
@@ -42,7 +42,6 @@ describe Gantree::CLI do
|
|
42
42
|
execute("bin/gantree init #{@owner}/#{@repo}:#{@tag} --dry-run")
|
43
43
|
out = execute("bin/gantree deploy #{@env} --dry-run --silent")
|
44
44
|
expect(out).to include("Found Application: #{@env}")
|
45
|
-
expect(out).to include("dry_run: dry_run")
|
46
45
|
expect(out).to include("silent: silent")
|
47
46
|
end
|
48
47
|
|
@@ -50,7 +49,6 @@ describe Gantree::CLI do
|
|
50
49
|
out = execute("bin/gantree deploy #{@app} -x 'git@github.com:br/.ebextensions' --dry-run --silent")
|
51
50
|
expect(out).to include("Found Environment: #{@app}")
|
52
51
|
expect(out).to include("ext: git@github.com:br/.ebextensions")
|
53
|
-
expect(out).to include("dry_run: dry_run")
|
54
52
|
expect(out).to include("silent: silent")
|
55
53
|
end
|
56
54
|
|
@@ -58,7 +56,6 @@ describe Gantree::CLI do
|
|
58
56
|
out = execute("bin/gantree deploy #{@env} -x 'git@github.com:br/.ebextensions:basic' --dry-run --silent")
|
59
57
|
expect(out).to include("Found Application: #{@env}")
|
60
58
|
expect(out).to include("ext: git@github.com:br/.ebextensions:basic")
|
61
|
-
expect(out).to include("dry_run: dry_run")
|
62
59
|
expect(out).to include("silent: silent")
|
63
60
|
end
|
64
61
|
|
@@ -70,32 +67,32 @@ describe Gantree::CLI do
|
|
70
67
|
|
71
68
|
describe "create" do
|
72
69
|
it "should create clusters" do
|
73
|
-
out = execute("bin/gantree create #{@env} --dry-run")
|
70
|
+
out = execute("bin/gantree create #{@env} --dry-run --cfn-bucket templates")
|
74
71
|
expect(out).to include "instance_size: m3.medium"
|
75
72
|
expect(out).to include "stack_name: #{@env}"
|
76
|
-
expect(out).to include "cfn_bucket:
|
73
|
+
expect(out).to include "cfn_bucket: templates"
|
77
74
|
end
|
78
75
|
|
79
76
|
it "should create clusters with any docker version" do
|
80
|
-
out = execute("bin/gantree create #{@env} --dry-run --
|
81
|
-
expect(out).to include "
|
77
|
+
out = execute("bin/gantree create #{@env} --dry-run --solution '64bit Amazon Linux 2014.03 v1.0.1 running Docker 1.0.0' --cfn-bucket template")
|
78
|
+
expect(out).to include "solution: 64bit Amazon Linux 2014.03 v1.0.1 running Docker 1.0.0"
|
82
79
|
end
|
83
80
|
|
84
81
|
it "should create clusters with databases" do
|
85
|
-
out = execute("bin/gantree create #{@env} --dry-run --rds pg")
|
82
|
+
out = execute("bin/gantree create #{@env} --dry-run --rds pg --cfn-bucket template")
|
86
83
|
expect(out).to include "rds: pg"
|
87
84
|
expect(out).to include "rds_enabled: true"
|
88
85
|
end
|
89
86
|
|
90
87
|
it "should create dupliacte clusters from local cfn" do
|
91
|
-
out = execute("bin/gantree create #{@new_env} --dupe #{@env} --dry-run")
|
88
|
+
out = execute("bin/gantree create #{@new_env} --dupe #{@env} --dry-run --cfn-bucket template")
|
92
89
|
expect(out).to include "dupe: #{@env}"
|
93
90
|
end
|
94
91
|
end
|
95
92
|
|
96
93
|
describe "update" do
|
97
94
|
it "should update existing clusters" do
|
98
|
-
out = execute("bin/gantree update #{@env} --dry-run")
|
95
|
+
out = execute("bin/gantree update #{@env} --dry-run --cfn-bucket template")
|
99
96
|
expect(out).to include "Updating"
|
100
97
|
end
|
101
98
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "pry"
|
3
|
+
|
4
|
+
describe Gantree::Update do
|
5
|
+
before(:all) do
|
6
|
+
ENV['AWS_ACCESS_KEY_ID'] = 'FAKE_AWS_ACCESS_KEY'
|
7
|
+
ENV['AWS_SECRET_ACCESS_KEY'] = 'FAKE_AWS_SECRET_ACCESS_KEY'
|
8
|
+
|
9
|
+
@stack_name = "knarr-stag-s1"
|
10
|
+
@env = "stag-knarr-app-s1"
|
11
|
+
@owner = "bleacher"
|
12
|
+
@repo = "cauldron"
|
13
|
+
@tag = "master"
|
14
|
+
@user = "feelobot"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "performs a cloudformation stack create"
|
18
|
+
it "can add an application role to the stack template"
|
19
|
+
it "can update to a specific solution stack"
|
20
|
+
it "can update to the latest solution stack automatically"
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "pry"
|
3
|
+
|
4
|
+
describe Gantree::Delete do
|
5
|
+
before(:all) do
|
6
|
+
AWS.stub!
|
7
|
+
ENV['AWS_ACCESS_KEY_ID'] = 'FAKE_AWS_ACCESS_KEY'
|
8
|
+
ENV['AWS_SECRET_ACCESS_KEY'] = 'FAKE_AWS_SECRET_ACCESS_KEY'
|
9
|
+
@stack_name = "knarr-stag-s1"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "prompts for confirmation"
|
13
|
+
it "prompt requires 'y' to delete"
|
14
|
+
it "prompt is canceled on any other input"
|
15
|
+
let(:delete) { Gantree::Delete.new(@stack_name,{:force => true})}
|
16
|
+
it "prompt can be overrided with --force" do
|
17
|
+
expect { delete.run}.to output("Deleting stack from aws\n").to_stdout
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "pry"
|
3
|
+
|
4
|
+
describe Gantree::Update do
|
5
|
+
before(:all) do
|
6
|
+
AWS.stub!
|
7
|
+
ENV['AWS_ACCESS_KEY_ID'] = 'FAKE_AWS_ACCESS_KEY'
|
8
|
+
ENV['AWS_SECRET_ACCESS_KEY'] = 'FAKE_AWS_SECRET_ACCESS_KEY'
|
9
|
+
|
10
|
+
@stack_name = "cms-stag-s2"
|
11
|
+
@env = "stag-cms-app-s1"
|
12
|
+
@owner = "bleacher"
|
13
|
+
@repo = "cauldron"
|
14
|
+
@tag = "master"
|
15
|
+
@user = "feelobot"
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:update) { Gantree::Update.new(@stack_name,{:dry_run => true}).run}
|
19
|
+
it "performs a cloudformation stack update" do
|
20
|
+
expect { update }.to output("Updating stack from local cfn repo\n").to_stdout
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "change_solution_stack" do
|
24
|
+
let!(:update) { Gantree::Update.new(@stack_name,{:dry_run => true,:solution => "64bit Amazon Linux 2014.09 v1.0.10 running Docker 1.3.2"})}
|
25
|
+
it "can update to a specific solution stack using --role 'solution name'" do
|
26
|
+
expect { update.change_solution_stack }.to output("\e[0;32;49mUpdated solution to 64bit Amazon Linux 2014.09 v1.0.10 running Docker 1.3.2\e[0m\n").to_stdout
|
27
|
+
end
|
28
|
+
let!(:update) { Gantree::Update.new(@stack_name,{:dry_run => true,:solution => "64bit Amazon Linux 2014.09 v1.0.10 running Docker 1.3.2"})}
|
29
|
+
it "can update to the latest solution stack automatically using --role latest" do
|
30
|
+
#expect { update.get_latest_docker_solution }.to output("asda").to_stdout
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "add_role" do
|
35
|
+
let(:update) { Gantree::Update.new(@stack_name,{:role => "worker", :dry_run => true})}
|
36
|
+
it "can add an worker role to the stack template with --role" do
|
37
|
+
expect{ update.add_role "worker"}.to_not output("\e[0;31;49mRole already exists\e[0m\n").to_stdout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gantree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -275,17 +275,21 @@ files:
|
|
275
275
|
- lib/gantree/cfn/resources.rb
|
276
276
|
- lib/gantree/cli.rb
|
277
277
|
- lib/gantree/cli/help.rb
|
278
|
+
- lib/gantree/create.rb
|
279
|
+
- lib/gantree/delete.rb
|
278
280
|
- lib/gantree/deploy.rb
|
279
281
|
- lib/gantree/docker.rb
|
280
282
|
- lib/gantree/init.rb
|
281
283
|
- lib/gantree/notification.rb
|
282
|
-
- lib/gantree/
|
284
|
+
- lib/gantree/update.rb
|
283
285
|
- lib/gantree/version.rb
|
284
286
|
- spec/lib/gantree/cli_spec.rb
|
287
|
+
- spec/lib/gantree/create_spec.rb
|
288
|
+
- spec/lib/gantree/delete_spec.rb
|
285
289
|
- spec/lib/gantree/deploy_spec.rb
|
286
290
|
- spec/lib/gantree/docker_spec.rb
|
287
291
|
- spec/lib/gantree/init_spec.rb
|
288
|
-
- spec/lib/gantree/
|
292
|
+
- spec/lib/gantree/update_spec.rb
|
289
293
|
- spec/spec_helper.rb
|
290
294
|
homepage: https://github.com/feelobot/gantree
|
291
295
|
licenses:
|
@@ -316,8 +320,10 @@ summary: This tool is intended to help you setup a Dockerrun.aws.json which allo
|
|
316
320
|
an archive of every versioned Dockerrun.aws.json in amazons s3 bucket service.
|
317
321
|
test_files:
|
318
322
|
- spec/lib/gantree/cli_spec.rb
|
323
|
+
- spec/lib/gantree/create_spec.rb
|
324
|
+
- spec/lib/gantree/delete_spec.rb
|
319
325
|
- spec/lib/gantree/deploy_spec.rb
|
320
326
|
- spec/lib/gantree/docker_spec.rb
|
321
327
|
- spec/lib/gantree/init_spec.rb
|
322
|
-
- spec/lib/gantree/
|
328
|
+
- spec/lib/gantree/update_spec.rb
|
323
329
|
- spec/spec_helper.rb
|
data/lib/gantree/stack.rb
DELETED
@@ -1,227 +0,0 @@
|
|
1
|
-
require 'cloudformation-ruby-dsl'
|
2
|
-
require 'highline/import'
|
3
|
-
require_relative 'cfn/master'
|
4
|
-
require_relative 'cfn/beanstalk'
|
5
|
-
require_relative 'cfn/resources'
|
6
|
-
|
7
|
-
module Gantree
|
8
|
-
class Stack < Base
|
9
|
-
attr_reader :env
|
10
|
-
|
11
|
-
def initialize stack_name,options
|
12
|
-
check_credentials
|
13
|
-
set_aws_keys
|
14
|
-
|
15
|
-
@cfm = AWS::CloudFormation.new
|
16
|
-
@requirements = "#!/usr/bin/env ruby
|
17
|
-
require 'cloudformation-ruby-dsl/cfntemplate'
|
18
|
-
require 'cloudformation-ruby-dsl/spotprice'
|
19
|
-
require 'cloudformation-ruby-dsl/table'"
|
20
|
-
|
21
|
-
additional_options = {
|
22
|
-
stack_name: stack_name,
|
23
|
-
requirements: @requirements,
|
24
|
-
cfn_bucket: "br-templates",
|
25
|
-
domain: "brenv.net.",
|
26
|
-
stack_hash: (0...8).map { (65 + rand(26)).chr }.join
|
27
|
-
}
|
28
|
-
@options = options.merge(additional_options)
|
29
|
-
@options[:env] ||= create_default_env
|
30
|
-
@options[:env_type] ||= env_type
|
31
|
-
end
|
32
|
-
|
33
|
-
def create_default_env
|
34
|
-
tags = @options[:stack_name].split("-")
|
35
|
-
if tags.length == 3
|
36
|
-
env = [tags[1],tags[0],"app",tags[2]].join('-')
|
37
|
-
else
|
38
|
-
raise "Please Set Envinronment Name with -e"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def create
|
43
|
-
@options[:rds_enabled] = rds_enabled? if @options[:rds]
|
44
|
-
print_options
|
45
|
-
create_cfn_if_needed
|
46
|
-
create_all_templates unless @options[:local]
|
47
|
-
upload_templates unless @options[:dry_run]
|
48
|
-
create_aws_cfn_stack unless @options[:dry_run]
|
49
|
-
end
|
50
|
-
|
51
|
-
def update
|
52
|
-
puts "Updating stack from local cfn repo"
|
53
|
-
add_role @options[:role] if @options[:role]
|
54
|
-
change_solution_stack if @options[:solution]
|
55
|
-
return if @options[:dry_run]
|
56
|
-
upload_templates
|
57
|
-
puts "Stack Updated".green if @cfm.stacks[@options[:stack_name]].update(:template => stack_template)
|
58
|
-
end
|
59
|
-
|
60
|
-
def delete
|
61
|
-
if @options[:force]
|
62
|
-
input = "y"
|
63
|
-
else
|
64
|
-
input = ask "Are you sure? (y|n)"
|
65
|
-
end
|
66
|
-
if input == "y" || @options[:force]
|
67
|
-
puts "Deleting stack from aws"
|
68
|
-
@cfm.stacks[@options[:stack_name]].delete unless @options[:dry_run]
|
69
|
-
else
|
70
|
-
puts "canceling..."
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
def stack_template
|
76
|
-
s3.buckets["#{@options[:cfn_bucket]}/#{@options[:stack_name]}"].objects["#{@options[:stack_name]}-master.cfn.json"]
|
77
|
-
end
|
78
|
-
|
79
|
-
def create_cfn_if_needed
|
80
|
-
Dir.mkdir 'cfn' unless File.directory?("cfn")
|
81
|
-
end
|
82
|
-
|
83
|
-
def create_all_templates
|
84
|
-
if @options[:dupe]
|
85
|
-
puts "Duplicating cluster"
|
86
|
-
orgin_stack_name = @options[:dupe]
|
87
|
-
templates = ['master','resources','beanstalk']
|
88
|
-
templates.each do |template|
|
89
|
-
FileUtils.cp("cfn/#{orgin_stack_name}-#{template}.cfn.json", "cfn/#{@options[:stack_name]}-#{template}.cfn.json")
|
90
|
-
file = IO.read("cfn/#{@options[:stack_name]}-#{template}.cfn.json")
|
91
|
-
file.gsub!(/#{escape_characters_in_string(orgin_stack_name)}/, @options[:stack_name])
|
92
|
-
replace_env_references(file)
|
93
|
-
IO.write("cfn/#{@options[:stack_name]}-#{template}.cfn.json",file)
|
94
|
-
end
|
95
|
-
else
|
96
|
-
puts "Generating templates from gantree"
|
97
|
-
generate("master", MasterTemplate.new(@options).create)
|
98
|
-
generate("beanstalk", BeanstalkTemplate.new(@options).create)
|
99
|
-
generate("resources", ResourcesTemplate.new(@options).create)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def replace_env_references file
|
104
|
-
origin_tags = @options[:dupe].split("-")
|
105
|
-
new_tags = @options[:stack_name].split("-")
|
106
|
-
possible_roles = ["app","worker","listener","djay","scheduler","sched"]
|
107
|
-
possible_roles.each do |role|
|
108
|
-
origin_env = [origin_tags[1],origin_tags[0],role,origin_tags[2]].join('-')
|
109
|
-
new_env = [new_tags[1],new_tags[0],role,new_tags[2]].join('-')
|
110
|
-
file.gsub!(/#{escape_characters_in_string(origin_env)}/, new_env)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def escape_characters_in_string(string)
|
115
|
-
pattern = /(\'|\"|\.|\*|\/|\-|\\)/
|
116
|
-
string.gsub(pattern){|match|"\\" + match} # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that).
|
117
|
-
end
|
118
|
-
|
119
|
-
def generate(template_name, template)
|
120
|
-
IO.write("cfn/#{template_name}.rb", template)
|
121
|
-
json = `ruby cfn/#{template_name}.rb expand`
|
122
|
-
Dir.mkdir 'cfn' rescue Errno::ENOENT
|
123
|
-
template_file_name = "#{@options[:stack_name]}-#{template_name}.cfn.json"
|
124
|
-
IO.write("cfn/#{template_file_name}", json)
|
125
|
-
puts "Created #{template_file_name} in the cfn directory"
|
126
|
-
FileUtils.rm("cfn/#{template_name}.rb")
|
127
|
-
end
|
128
|
-
|
129
|
-
def upload_templates
|
130
|
-
check_template_bucket
|
131
|
-
templates = ['master','resources','beanstalk']
|
132
|
-
templates.each do |template|
|
133
|
-
filename = "cfn/#{@options[:stack_name]}-#{template}.cfn.json"
|
134
|
-
key = File.basename(filename)
|
135
|
-
s3.buckets["#{@options[:cfn_bucket]}/#{@options[:stack_name]}"].objects[key].write(:file => filename)
|
136
|
-
end
|
137
|
-
puts "templates uploaded"
|
138
|
-
end
|
139
|
-
|
140
|
-
def check_template_bucket
|
141
|
-
bucket_name = "#{@options[:cfn_bucket]}/#{@options[:stack_name]}"
|
142
|
-
if s3.buckets[bucket_name].exists?
|
143
|
-
puts "uploading cfn templates to #{@options[:cfn_bucket]}/#{@options[:stack_name]}"
|
144
|
-
else
|
145
|
-
puts "creating bucket #{@options[:cfn_bucket]}/#{@options[:stack_name]} to upload templates"
|
146
|
-
s3.buckets.create(bucket_name)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def create_aws_cfn_stack
|
151
|
-
puts "Creating stack on aws..."
|
152
|
-
stack = @cfm.stacks.create(@options[:stack_name], stack_template, {
|
153
|
-
:disable_rollback => true,
|
154
|
-
:tags => [
|
155
|
-
{ key: "StackName", value: @options[:stack_name] },
|
156
|
-
]})
|
157
|
-
end
|
158
|
-
|
159
|
-
def rds_enabled?
|
160
|
-
if @options[:rds] == nil
|
161
|
-
puts "RDS is not enabled, no DB created"
|
162
|
-
false
|
163
|
-
elsif @options[:rds] == "pg" || @rds == "mysql"
|
164
|
-
puts "RDS is enabled, creating DB"
|
165
|
-
true
|
166
|
-
else
|
167
|
-
raise "The --rds option you passed is not supported please use 'pg' or 'mysql'"
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def env_type
|
172
|
-
if @options[:env].include?("prod")
|
173
|
-
"prod"
|
174
|
-
elsif @options[:env].include?("stag")
|
175
|
-
"stag"
|
176
|
-
else
|
177
|
-
""
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def change_solution_stack
|
182
|
-
beanstalk = JSON.parse(IO.read("cfn/#{@options[:stack_name]}-beanstalk.cfn.json"))
|
183
|
-
solution_stack = set_solution_stack
|
184
|
-
beanstalk["Resources"]["ConfigurationTemplate"]["Properties"]["SolutionStackName"] = solution_stack
|
185
|
-
beanstalk["Resources"]["ConfigurationTemplate"]["Properties"]["Description"] = solution_stack
|
186
|
-
IO.write("cfn/#{@options[:stack_name]}-beanstalk.cfn.json",JSON.pretty_generate(beanstalk))
|
187
|
-
end
|
188
|
-
|
189
|
-
def set_solution_stack
|
190
|
-
@options[:solution] == "latest" ? get_latest_docker_solution : @options[:solution]
|
191
|
-
end
|
192
|
-
|
193
|
-
def get_latest_docker_solution
|
194
|
-
result = eb.list_available_solution_stacks
|
195
|
-
solutions = result[:solution_stacks]
|
196
|
-
docker_solutions = solutions.select { |s| s.include? "running Docker"}
|
197
|
-
docker_solutions.first
|
198
|
-
end
|
199
|
-
|
200
|
-
def add_role name
|
201
|
-
env = @options[:env].sub('app', name)
|
202
|
-
beanstalk = JSON.parse(IO.read("cfn/#{@options[:stack_name]}-beanstalk.cfn.json"))
|
203
|
-
unless beanstalk["Resources"][name] then
|
204
|
-
role = {
|
205
|
-
"Type" => "AWS::ElasticBeanstalk::Environment",
|
206
|
-
"Properties"=> {
|
207
|
-
"ApplicationName" => "#{@options[:stack_name]}",
|
208
|
-
"EnvironmentName" => "#{env}",
|
209
|
-
"Description" => "#{name} Environment",
|
210
|
-
"TemplateName" => {
|
211
|
-
"Ref" => "ConfigurationTemplate"
|
212
|
-
},
|
213
|
-
"OptionSettings" => []
|
214
|
-
}
|
215
|
-
}
|
216
|
-
#puts JSON.pretty_generate role
|
217
|
-
beanstalk["Resources"]["#{name}".to_sym] = role
|
218
|
-
IO.write("cfn/#{@options[:stack_name]}-beanstalk.cfn.json", JSON.pretty_generate(beanstalk))
|
219
|
-
puts JSON.pretty_generate(beanstalk["Resources"].to_a.last)
|
220
|
-
puts "Added new #{name} role".green
|
221
|
-
else
|
222
|
-
puts "Role already exists".red
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|