elastic_beans 0.11.0.alpha5 → 0.11.0.alpha7

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: ced35135b31c46cdc993f0e19d7e73c6219ed72d
4
- data.tar.gz: 3b028b2d8b6c0b9bfe7da052cca5fd4a66e90cb6
3
+ metadata.gz: ab4560c3622e7fe3d379e37a6691663abdafe52c
4
+ data.tar.gz: 9ec0036df9f9df63f1687be7c668244acc231727
5
5
  SHA512:
6
- metadata.gz: 90d8f569a7ed92b940fd9e713278dd9afe6e42cc1873c2456f5fbd84a63e14f73c030683e03e0dc1f9c06c581e45e4c30c089bb60b1c3d9246a5d0cd7ba7a898
7
- data.tar.gz: 1a8be85e3b7624ee55c9105f84d9e83530d874ee8bbe13648c0869f9ad0eb05dfa1c032da7d1e57f5d7e143f232c6047e472094755076237f3fb52de7e521d46
6
+ metadata.gz: 71a71115042d5a7128f0803754ef5120b2a8aa96b85e6454b5e2c08f719877ba856574566281227a375dbbbd4788e33c2733b89f17dc416638c4e5f79fb3df2d
7
+ data.tar.gz: 800d01320e7cf59f0d4ba8e654b643086094cfa103514b542af5aba7cce63908cfb4740039c5aa2c5eae7238c1fcb249f78536b9d4364deb107bd529e8eb2b40
data/README.md CHANGED
@@ -194,9 +194,11 @@ It must have the following outputs, which will be used for the corresponding set
194
194
  * `ApplicationSecurityGroup` - [`aws:autoscaling:launchconfiguration/SecurityGroups`][launchconfiguration]
195
195
  * Allow TCP connections from the `ELBSecurityGroup` on ports 80 and 443
196
196
  * `ApplicationSubnet` - [`aws:ec2:vpc/Subnets`][vpc]
197
+ * Use multiple subnets by appending digits to this name, e.g. `ApplicationSubnet` and `ApplicationSubnet2`
197
198
  * `ELBSecurityGroup` - [`aws:elb:loadbalancer/SecurityGroups`][loadbalancer], [`aws:elb:loadbalancer/ManagedSecurityGroup`][loadbalancer]
198
199
  * Allow TCP connections on ports 80 and 443 from `0.0.0.0/0`
199
200
  * `ELBSubnet` - [`aws:ec2:vpc/ELBSubnets`][vpc]
201
+ * Use multiple subnets by appending digits to this name, e.g. `ELBSubnet` and `ELBSubnet2`
200
202
  * `SSHSecurityGroup` - [`aws:ec2:vpc/Subnets`][vpc]
201
203
  * Allow TCP connections from your VPC on ports 80 and 443
202
204
  * `VpcId` - [`aws:ec2:vpc/VPCId`][vpc]
data/exe/beans CHANGED
@@ -2,14 +2,18 @@
2
2
 
3
3
  Signal.trap("INT") do
4
4
  puts "\nInterrupting beans -- if an operation was in progress, it will still be running."
5
- exit 130
5
+ raise Interrupt
6
6
  end
7
7
 
8
8
  Signal.trap("TERM") do
9
9
  puts "Terminating beans -- if an operation was in progress, it will still be running."
10
- exit 143
10
+ raise SignalException.new("TERM")
11
11
  end
12
12
 
13
13
  require "elastic_beans/cli"
14
14
 
15
- ElasticBeans::CLI.start(ARGV)
15
+ begin
16
+ ElasticBeans::CLI.start(ARGV)
17
+ rescue SignalException => e
18
+ exit(128 + e.signo)
19
+ end
@@ -9,15 +9,17 @@ module ElasticBeans
9
9
  class CloudformationStack
10
10
  STACK_STATUSES = %w(CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE)
11
11
 
12
- def initialize(stack_name, cloudformation:)
13
- @stack_name = stack_name
12
+ attr_reader :name
13
+
14
+ def initialize(name, cloudformation:)
15
+ @name = name
14
16
  @cloudformation = cloudformation
15
17
  end
16
18
 
17
19
  def stack_output(output_key)
18
20
  output = stack.outputs.find { |o| o.output_key == output_key }
19
21
  unless output
20
- raise MissingOutputError.new(stack_name: stack_name, output_key: output_key)
22
+ raise MissingOutputError.new(stack_name: name, output_key: output_key)
21
23
  end
22
24
  output.output_value
23
25
  end
@@ -28,20 +30,20 @@ module ElasticBeans
28
30
 
29
31
  private
30
32
 
31
- attr_reader :stack_name, :cloudformation
33
+ attr_reader :cloudformation
32
34
 
33
35
  def stack
34
- s = cloudformation.describe_stacks(stack_name: stack_name).stacks.find { |stack|
36
+ s = cloudformation.describe_stacks(stack_name: name).stacks.find { |stack|
35
37
  STACK_STATUSES.include?(stack.stack_status)
36
38
  }
37
39
  unless s
38
- raise MissingStackError.new(stack_name: stack_name)
40
+ raise MissingStackError.new(stack_name: name)
39
41
  end
40
42
  s
41
43
  rescue ::Aws::CloudFormation::Errors::ValidationError
42
- raise MissingStackError.new(stack_name: stack_name)
44
+ raise MissingStackError.new(stack_name: name)
43
45
  rescue ::Aws::CloudFormation::Errors::AccessDenied
44
- raise AccessDeniedCloudFormationError.new(stack_name: stack_name)
46
+ raise AccessDeniedCloudFormationError.new(stack_name: name)
45
47
  rescue ::Aws::CloudFormation::Errors::Throttling
46
48
  sleep 5
47
49
  retry
@@ -109,9 +109,13 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
109
109
  rescue ElasticBeans::SSH::BastionAuthenticationError => e
110
110
  raise BastionAuthenticationError.new(cause: e)
111
111
  ensure
112
- ui.info("Cleaning up, please do not interrupt!")
113
- application.kill_command(freeze_command)
114
- application.deregister_command(command)
112
+ begin
113
+ ui.info("Cleaning up, please do not interrupt!")
114
+ application.kill_command(freeze_command)
115
+ application.deregister_command(command)
116
+ rescue Interrupt
117
+ retry
118
+ end
115
119
  end
116
120
  else
117
121
  application.enqueue_command(command)
@@ -5,8 +5,10 @@ module ElasticBeans
5
5
  class Network
6
6
  APPLICATION_SECURITY_GROUP_KEY = "ApplicationSecurityGroup"
7
7
  APPLICATION_SUBNET_KEY = "ApplicationSubnet"
8
+ APPLICATION_SUBNET_KEY_PATTERN = /\AApplicationSubnet\d*\z/
8
9
  ELB_SECURITY_GROUP_KEY = "ELBSecurityGroup"
9
10
  ELB_SUBNET_KEY = "ELBSubnet"
11
+ ELB_SUBNET_KEY_PATTERN = /\AELBSubnet\d*\z/
10
12
  SSH_SECURITY_GROUP_KEY = "SSHSecurityGroup"
11
13
  VPC_KEY = "VpcId"
12
14
 
@@ -19,7 +21,11 @@ module ElasticBeans
19
21
  end
20
22
 
21
23
  def application_subnets
22
- [stack.stack_output(APPLICATION_SUBNET_KEY)]
24
+ subnet_outputs = stack.stack_outputs.select { |key, value| key =~ APPLICATION_SUBNET_KEY_PATTERN }
25
+ if subnet_outputs.empty?
26
+ raise MissingNetworkingError.new(stack: stack, key: APPLICATION_SUBNET_KEY)
27
+ end
28
+ subnet_outputs.values
23
29
  end
24
30
 
25
31
  def elb_security_groups
@@ -27,7 +33,11 @@ module ElasticBeans
27
33
  end
28
34
 
29
35
  def elb_subnets
30
- [stack.stack_output(ELB_SUBNET_KEY)]
36
+ subnet_outputs = stack.stack_outputs.select { |key, value| key =~ ELB_SUBNET_KEY_PATTERN }
37
+ if subnet_outputs.empty?
38
+ raise MissingNetworkingError.new(stack: stack, key: ELB_SUBNET_KEY)
39
+ end
40
+ subnet_outputs.values
31
41
  end
32
42
 
33
43
  def ssh_security_group
@@ -41,5 +51,17 @@ module ElasticBeans
41
51
  private
42
52
 
43
53
  attr_reader :stack
54
+
55
+ class MissingNetworkingError < ElasticBeans::Error
56
+ def initialize(stack:, key:)
57
+ @stack = stack
58
+ @key = key
59
+ end
60
+
61
+ def message
62
+ "Networking stack '#{@stack.name}' is missing output '#{@key}'." \
63
+ " Make sure the stack matches the outputs required."
64
+ end
65
+ end
44
66
  end
45
67
  end
@@ -1,3 +1,3 @@
1
1
  module ElasticBeans
2
- VERSION = "0.11.0.alpha5"
2
+ VERSION = "0.11.0.alpha7"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic_beans
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0.alpha5
4
+ version: 0.11.0.alpha7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Stegman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-05 00:00:00.000000000 Z
11
+ date: 2017-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk