autocanary24 0.1.0.pre.alpha2 → 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: 593de61d296fbcb4d623c34ed1d85c9ead3f0df1
4
- data.tar.gz: 24a2110bd7b6eb3279ba688e787ddf4bcfd45c27
3
+ metadata.gz: d8cf4cb43f616b217f59cdd35f148e9e7747e5fd
4
+ data.tar.gz: a1733265748fc179e835b7fc062f24b90146b35f
5
5
  SHA512:
6
- metadata.gz: 166bd54e9b93f196b9edb3bebb8b7f9fa0fe4cf4817a842c32dcd977ed2d7d1d6f801a898d5191cd7d5b4fb19d955fdf2b083c572b4f6a0041ee68feebc55fbc
7
- data.tar.gz: 96ad955cbf530c595b175b0fcb24ab4420c0c76dd52f6f43e9fffd15fd82e4ebdb193ef6639f92dee1303e9b29d3706d333a2298d008bfec97e86aea52cd96e1
6
+ metadata.gz: b60821bc03cad2bd04ec1be8a8adb5e6657e8c6b6be3e9ac159df47c7154bd36435520307ea085b105203dbffe119d669743813e280b92a4bb70eafc718921e1
7
+ data.tar.gz: 8f7c432d4b3333059a77a468eebb9b4eda13d40599f89fb65926090caba4622fa56072615529c513aeccefb37b3b3e8506f37ba149605c7a082b1e1e9f700fba
data/README.md CHANGED
@@ -24,33 +24,45 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
+ Prerequisite: Deploy the base stack before
28
+
27
29
  Initialize the client, e.g. in your `Rakefile` and deploy your stack:
28
30
 
29
31
  ```ruby
30
- # Deploy the base stack before
31
-
32
+ # Configure the AutoCanary24 Client
32
33
  ac = AutoCanary24::Client.new({
33
34
  keep_inactive_stack: false,
34
- scaling_instance_percent: 50,
35
- keep_instances_balanced: false})
35
+ keep_instances_balanced: false,
36
+ scaling_instance_percent: 50
37
+ })
38
+ ```
36
39
 
40
+ The available configuration:
41
+ - `keep_inactive_stack`: If `true` the inactive stack gets not deleted.
42
+ Default is `false`
43
+ - `keep_instances_balanced`: If `true` a instance from current stack gets removed whenever a new instance from the new stack is added. If `false` first all new instances are created and afterwards the old instances gets removed.
44
+ Default is `false`
45
+ - `scaling_instance_percent`: Percent of instances which are added at once (depends on the actual number of instances, read from desired).
46
+ Default is `100`
47
+ - `wait_timeout`: Timeout in seconds to wait for checking AWS operations are done before do a rollback.
48
+ Default is `300`
49
+
50
+ ```ruby
51
+ # Execute the deployment
37
52
  ac.deploy_stack(parent_stack_name, template, parameters, tags, deployment_check)
38
53
  ```
39
54
 
55
+ The available parameters:
40
56
  - `parent_stack_name`: the name of the 'base' stack. In addition `AutoStacker24` will read the output parameters of an existing stack and merge them to the given parameters.
41
57
  - `template`: is either the template json data itself or the name of a file containing the template body
42
58
  - `parameters`: specify the input parameter as a simple ruby hash. It gets converted to the
43
59
  cumbersome AWS format automatically.
44
60
  The template body will be validated and optionally preprocessed.
45
61
  - `tags`: Optional. Key-value pairs to associate with this stack.
46
- - 'deployment_check': Optional. A `lambda` which is executed whenever new instances are added to the ELB. If `true` AutoCanary continues, if `false` it will rollback to the current stack.
62
+ - `deployment_check`: Optional. A `lambda` which is executed whenever new instances are added to the ELB. If `true` AutoCanary continues, if `false` it will rollback to the current stack.
47
63
 
48
64
  > For more information about stacked CloudFormation stacks visit [AutoStacker24](https://github.com/autoscout24/autostacker24).
49
65
 
50
- The available configuration:
51
- - `keep_inactive_stack`: If `true` the inactive stack gets not deleted. Default is `false`
52
- - `keep_instances_balanced`: If `true` a instance from current stack gets removed whenever a new instance from the new stack is added. If `false` first all new instances are created and afterwards the old instances gets removed.
53
- - `scaling_instance_percent`: Percent of instances which are added at once (depends on the actual number of instances, read from desired)
54
66
 
55
67
 
56
68
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" version="5.4.0.6" editor="www.draw.io" type="google"><diagram>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</diagram></mxfile>
Binary file
data/examples/README.md CHANGED
@@ -0,0 +1,49 @@
1
+ # Examples
2
+
3
+ This folder contains 4 different examples how AutoCanary24 can be used. You should have set the AWS credentials before you execute them.
4
+
5
+ ## 1) Switch complete stacks at once not keeping the inactive stack
6
+
7
+ How to run: `rake sample_1`
8
+
9
+ | Steps | |
10
+ | :------------- | :------------- |
11
+ | Initial state: All the traffic goes to blue stack | <img src="../docs/autocanary_100_none.png" height="150" /> |
12
+ | Green stack is created | <img src="../docs/autocanary_100_0.png" height="150" /> |
13
+ | Green stack gets all the traffic | <img src="../docs/autocanary_0_100.png" height="150" /> |
14
+ | Blue stack will be deleted | <img src="../docs/autocanary_none_100.png" height="150" /> |
15
+
16
+ ## 2) Switch complete stacks at once keeping the inactive stack
17
+
18
+ How to run: `rake sample_2`
19
+
20
+ | Steps | |
21
+ | :------------- | :------------- |
22
+ | Initial state: All the traffic goes to blue stack | <img src="../docs/autocanary_100_none.png" height="150" /> |
23
+ | Green stack is created | <img src="../docs/autocanary_100_0.png" height="150" /> |
24
+ | Green stack gets all the traffic. Blue stack will not be deleted | <img src="../docs/autocanary_0_100.png" height="150" /> |
25
+
26
+ ## 3) Switch incrementally the stacks keeping the inactive stack
27
+
28
+ How to run: `rake sample_3`
29
+
30
+ | Steps | |
31
+ | :------------- | :------------- |
32
+ | Initial state: All the traffic goes to blue stack | <img src="../docs/autocanary_100_0.png" height="150" /> |
33
+ | Green stack gets some traffic | <img src="../docs/autocanary_80_20.png" height="150" /> |
34
+ | Green stack gets more traffic | <img src="../docs/autocanary_50_50.png" height="150" /> |
35
+ | Green stack gets even more traffic | <img src="../docs/autocanary_20_80.png" height="150" /> |
36
+ | Final state: All the traffic goes to green stack | <img src="../docs/autocanary_0_100.png" height="150" /> |
37
+
38
+
39
+ ## 4) Switch incrementally the stacks and rollback
40
+
41
+ How to run: `rake sample_4`
42
+
43
+ | Steps | |
44
+ | :------------- | :------------- |
45
+ | Initial state: All the traffic goes to blue stack | <img src="../docs/autocanary_100_none.png" height="150" /> |
46
+ | Green stack is created | <img src="../docs/autocanary_100_0.png" height="150" /> |
47
+ | Green stack gets some traffic | <img src="../docs/autocanary_80_20.png" height="150" /> |
48
+ | Green stack gets more traffic | <img src="../docs/autocanary_50_50.png" height="150" /> |
49
+ | Rollback: All the traffic goes again to blue stack | <img src="../docs/autocanary_100_0.png" height="150" /> |
data/examples/Rakefile CHANGED
@@ -1,29 +1,85 @@
1
- require "aws-sdk-core"
2
- require "autostacker24"
3
- require_relative "../lib/autocanary24/client"
1
+ require 'aws-sdk-core'
2
+ require 'autostacker24'
3
+ require_relative '../lib/autocanary24/client'
4
4
 
5
5
  STACK_NAME = 'autocanary24-example'
6
6
  BASE_TEMPLATE = 'base-stack.json'
7
7
  ASG_TEMPLATE = 'asg-stack.json'
8
+ ASG_PARAMETER = { MinimumNumberOfServers: 5, MaximumNumberOfServers: 5 }
9
+ TAGS = [ { key: 'Name', value: STACK_NAME } ]
8
10
 
9
- task :default do
11
+ desc 'switch complete stacks at once not keeping the inactive stack'
12
+ task :sample_1 do
13
+ puts 'executing sample_1: switch complete stacks at once not keeping the inactive stack'
10
14
 
11
15
  # 1) Create the base stack which includes at least the ELB
12
- base_parameters = {}
13
- Stacker.create_or_update_stack(STACK_NAME, BASE_TEMPLATE, base_parameters)
16
+ Stacker.create_or_update_stack(STACK_NAME, BASE_TEMPLATE, {}, nil, TAGS)
14
17
 
15
18
  # 2) Create the stack which includes the ASG
16
19
  client = AutoCanary24::Client.new({
17
- :keep_inactive_stack => true
20
+ :keep_inactive_stack => false,
21
+ :keep_instances_balanced => false,
22
+ :scaling_instance_percent => 100
18
23
  })
24
+ client.deploy_stack(STACK_NAME, ASG_TEMPLATE, ASG_PARAMETER, TAGS)
25
+ end
26
+
27
+ desc 'switch complete stacks at once keeping the inactive stack'
28
+ task :sample_2 do
29
+ puts 'executing sample_2: switch complete stacks at once keeping the inactive stack'
19
30
 
20
- parameters = {}
21
- client.deploy_stack(STACK_NAME, ASG_TEMPLATE, parameters)
31
+ # 1) Create the base stack which includes at least the ELB
32
+ Stacker.create_or_update_stack(STACK_NAME, BASE_TEMPLATE, {}, nil, TAGS)
22
33
 
34
+ # 2) Create the stack which includes the ASG
35
+ client = AutoCanary24::Client.new({
36
+ :keep_inactive_stack => true,
37
+ :keep_instances_balanced => false,
38
+ :scaling_instance_percent => 100
39
+ })
40
+ client.deploy_stack(STACK_NAME, ASG_TEMPLATE, ASG_PARAMETER, TAGS)
41
+ end
42
+
43
+ desc 'switch incrementally the stacks keeping the inactive stack'
44
+ task :sample_3 do
45
+ puts 'executing sample_3: switch incrementally the stacks keeping the inactive stack'
46
+
47
+ # 1) Create the base stack which includes at least the ELB
48
+ Stacker.create_or_update_stack(STACK_NAME, BASE_TEMPLATE, {}, nil, TAGS)
49
+
50
+ # 2) Create the stack which includes the ASG
51
+ client = AutoCanary24::Client.new({
52
+ :keep_inactive_stack => true,
53
+ :keep_instances_balanced => true,
54
+ :scaling_instance_percent => 20
55
+ })
56
+ client.deploy_stack(STACK_NAME, ASG_TEMPLATE, ASG_PARAMETER, TAGS)
57
+ end
58
+
59
+ desc 'switch incrementally the stacks and rollback'
60
+ task :sample_4 do
61
+ puts 'executing sample_4: switch incrementally the stacks and rollback'
62
+
63
+ # 1) Create the base stack which includes at least the ELB
64
+ Stacker.create_or_update_stack(STACK_NAME, BASE_TEMPLATE, {}, nil, TAGS)
65
+
66
+ # 2) Create the stack which includes the ASG
67
+ client = AutoCanary24::Client.new({
68
+ :keep_inactive_stack => true,
69
+ :keep_instances_balanced => true,
70
+ :scaling_instance_percent => 20
71
+ })
72
+ deployment_check = lambda { |stacks, elb, new_attached_instances|
73
+ # break during the switch from blue to green in the third iteration
74
+ !(stacks[:stack_to_create].stack_name == "#{STACK_NAME}-G" && new_attached_instances.length > 2)
75
+ }
76
+ client.deploy_stack(STACK_NAME, ASG_TEMPLATE, ASG_PARAMETER, TAGS, deployment_check)
23
77
  end
24
78
 
25
79
  task :cleanup do
26
- Stacker.delete_stack('autocanary24-example-B')
27
- Stacker.delete_stack('autocanary24-example-G')
28
- Stacker.delete_stack('autocanary24-example')
80
+ puts 'executing cleanup'
81
+
82
+ Stacker.delete_stack("#{STACK_NAME}-B") unless Stacker.find_stack("#{STACK_NAME}-B").nil?
83
+ Stacker.delete_stack("#{STACK_NAME}-G") unless Stacker.find_stack("#{STACK_NAME}-G").nil?
84
+ Stacker.delete_stack(STACK_NAME) unless Stacker.find_stack(STACK_NAME).nil?
29
85
  end
@@ -14,6 +14,14 @@
14
14
  "Default" : "t2.nano",
15
15
  "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge"],
16
16
  "ConstraintDescription" : "must be a valid EC2 instance type."
17
+ },
18
+ "MinimumNumberOfServers": {
19
+ "Description": "Minimum number of servers to have in the autoscaling group",
20
+ "Type": "Number"
21
+ },
22
+ "MaximumNumberOfServers": {
23
+ "Description": "Maximum number of servers to have in the autoscaling group",
24
+ "Type": "Number"
17
25
  }
18
26
  },
19
27
 
@@ -162,8 +170,8 @@
162
170
  "Properties" : {
163
171
  "AvailabilityZones" : { "Fn::GetAZs" : ""},
164
172
  "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
165
- "MinSize" : "1",
166
- "MaxSize" : "3",
173
+ "MinSize" : "@MinimumNumberOfServers",
174
+ "MaxSize" : "@MaximumNumberOfServers",
167
175
  "HealthCheckGracePeriod" : "600",
168
176
  "HealthCheckType" : "ELB"
169
177
  },
@@ -23,8 +23,8 @@
23
23
  "Target" : "HTTP:80/",
24
24
  "HealthyThreshold" : "3",
25
25
  "UnhealthyThreshold" : "5",
26
- "Interval" : "30",
27
- "Timeout" : "5"
26
+ "Interval" : "5",
27
+ "Timeout" : "3"
28
28
  }
29
29
  }
30
30
  },
@@ -12,7 +12,7 @@ module AutoCanary24
12
12
  @configuration = Configuration.new(params) #params.fetch(:configuration, Configuration::new(params))
13
13
  end
14
14
 
15
- def deploy_stack(parent_stack_name, template, parameters, tags = nil, deployment_check = lambda { |stacks, elb, instances_to_create| true })
15
+ def deploy_stack(parent_stack_name, template, parameters, tags = nil, deployment_check = lambda { |stacks, elb, new_attached_instances| true })
16
16
  begin
17
17
  write_log(parent_stack_name, "Starting the deployment")
18
18
  write_log(parent_stack_name, "Using the following configuration #{@configuration.inspect}")
@@ -33,8 +33,15 @@ module AutoCanary24
33
33
 
34
34
  rescue Exception => e
35
35
  write_log(parent_stack_name, "Unexpected exception #{e}")
36
+ raise "Deployment failed"
36
37
  end
37
- write_log(parent_stack_name, "Deployment finished")
38
+
39
+ if failed
40
+ raise "Deployment failed because of rollback"
41
+ else
42
+ write_log(parent_stack_name, "Deployment finished")
43
+ end
44
+
38
45
  end
39
46
 
40
47
  private
@@ -86,30 +93,34 @@ module AutoCanary24
86
93
  instances_to_toggle = (desired / 100.0 * @configuration.scaling_instance_percent).round
87
94
  instances_to_toggle = 1 if (instances_to_toggle < 1)
88
95
 
89
- instances_to_create = stacks[:stack_to_create].get_instance_ids
90
- instances_to_delete = stacks[:stack_to_delete].nil? ? [] : stacks[:stack_to_delete].get_instance_ids
96
+ instances_to_attach = stacks[:stack_to_create].get_instance_ids
97
+ instances_to_detach = stacks[:stack_to_delete].nil? ? [] : stacks[:stack_to_delete].get_instance_ids
91
98
 
92
99
  missing = desired
93
100
  while missing > 0
94
101
 
95
102
  write_log(stacks[:stack_to_create].stack_name, "Adding #{instances_to_toggle} instances (#{desired-missing+instances_to_toggle}/#{desired})")
96
103
 
104
+ already_attached_instances = instances_to_attach[0, desired-missing+instances_to_toggle]
105
+ already_detached_instances = instances_to_detach[0, desired-missing]
106
+
97
107
  begin
98
- stacks[:stack_to_create].attach_instances_to_elb_and_wait(elb, instances_to_create[desired-missing, instances_to_toggle])
99
- rescue
100
- rollback(stacks, elb, instances_to_create, instances_to_delete)
108
+ stacks[:stack_to_create].attach_instances_to_elb_and_wait(elb, instances_to_attach[desired-missing, instances_to_toggle])
109
+ rescue Exception => e
110
+ write_log(stacks[:stack_to_create].stack_name, "Unexpected exception: #{e}")
111
+ rollback(stacks, elb, already_attached_instances, already_detached_instances)
101
112
  return true
102
113
  end
103
114
 
104
- unless deployment_check.call(stacks, elb, instances_to_create)
105
- rollback(stacks, elb, instances_to_create, instances_to_delete)
115
+ unless deployment_check.call(stacks, elb, already_attached_instances)
116
+ rollback(stacks, elb, already_attached_instances, already_detached_instances)
106
117
  return true
107
118
  end
108
119
 
109
120
  if @configuration.keep_instances_balanced && !stacks[:stack_to_delete].nil?
110
121
  begin
111
- write_log(stacks[:stack_to_delete].stack_name, "Removing #{instances_to_toggle} instances (#{instances_to_delete[desired-missing, instances_to_toggle]})")
112
- stacks[:stack_to_delete].detach_instances_from_elb(elb, instances_to_delete[desired-missing, instances_to_toggle])
122
+ write_log(stacks[:stack_to_delete].stack_name, "Removing #{instances_to_toggle} instances (#{instances_to_detach[desired-missing, instances_to_toggle]})")
123
+ stacks[:stack_to_delete].detach_instances_from_elb(elb, instances_to_detach[desired-missing, instances_to_toggle])
113
124
  rescue Exception => e
114
125
  write_log(stacks[:stack_to_delete].stack_name, "WARNING: #{e}")
115
126
  end
@@ -130,10 +141,11 @@ module AutoCanary24
130
141
  end
131
142
  end
132
143
 
133
- def rollback(stacks, elb, instances_to_create, instances_to_delete)
144
+ def rollback(stacks, elb, already_attached_instances, already_detached_instances)
145
+ write_log("", "Rollback triggered")
134
146
  begin
135
- stacks[:stack_to_create].detach_instances_from_elb(elb, instances_to_create)
136
- stacks[:stack_to_delete].attach_instances_to_elb_and_wait(elb, instances_to_delete)
147
+ stacks[:stack_to_create].detach_instances_from_elb(elb, already_attached_instances)
148
+ stacks[:stack_to_delete].attach_instances_to_elb_and_wait(elb, already_detached_instances)
137
149
  rescue Exception => e
138
150
  write_log("", "ROLLBACK FAILED: #{e}")
139
151
  end
@@ -141,10 +153,13 @@ module AutoCanary24
141
153
 
142
154
  def after_switch(stacks, keep_inactive_stack)
143
155
  stacks[:stack_to_create].resume_asg_processes
144
- stacks[:stack_to_delete].resume_asg_processes unless stacks[:stack_to_delete].nil?
145
156
 
146
- if keep_inactive_stack == false
147
- delete_stack(stacks[:stack_to_delete])
157
+ unless stacks[:stack_to_delete].nil?
158
+ stacks[:stack_to_delete].resume_asg_processes
159
+
160
+ unless keep_inactive_stack
161
+ delete_stack(stacks[:stack_to_delete].stack_name)
162
+ end
148
163
  end
149
164
  end
150
165
 
@@ -6,7 +6,7 @@ module AutoCanary24
6
6
  attr_accessor :keep_instances_balanced
7
7
  # Percent of instances which are added at once (depends on the actual number of instances, read from desired)
8
8
  attr_accessor :scaling_instance_percent
9
- # Timeout to wait for checking AWS operations are done before do a rollback
9
+ # Timeout in seconds to wait for checking AWS operations are done before do a rollback
10
10
  attr_accessor :wait_timeout
11
11
 
12
12
  def initialize(**params)
@@ -1,3 +1,3 @@
1
1
  module AutoCanary24
2
- VERSION = "0.1.0-alpha2"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autocanary24
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.alpha2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philipp Garbe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: autostacker24
@@ -98,6 +98,14 @@ files:
98
98
  - autocanary24.gemspec
99
99
  - bin/console
100
100
  - bin/setup
101
+ - docs/autocanary_0_100.png
102
+ - docs/autocanary_100_0.png
103
+ - docs/autocanary_100_none.png
104
+ - docs/autocanary_20_80.png
105
+ - docs/autocanary_50_50.png
106
+ - docs/autocanary_80_20.png
107
+ - docs/autocanary_drawio.xml
108
+ - docs/autocanary_none_100.png
101
109
  - examples/.bundle/config
102
110
  - examples/Gemfile
103
111
  - examples/Gemfile.lock
@@ -125,9 +133,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
133
  version: '0'
126
134
  required_rubygems_version: !ruby/object:Gem::Requirement
127
135
  requirements:
128
- - - ">"
136
+ - - ">="
129
137
  - !ruby/object:Gem::Version
130
- version: 1.3.1
138
+ version: '0'
131
139
  requirements: []
132
140
  rubyforge_project:
133
141
  rubygems_version: 2.4.5.1