cfn_manage 0.2.7 → 0.2.8

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
- SHA1:
3
- metadata.gz: 7819e8e194008b4957fc32b3cc6d0edf3ac11104
4
- data.tar.gz: f1bf8e22cfa7b556fbd64fed45edb0d7ad99606a
2
+ SHA256:
3
+ metadata.gz: 3d8a7ed727a31e5b2a377abd2cedf2e1e9dedd1ec5225d3a6e5c2c85f6f402b6
4
+ data.tar.gz: fb0c0023eb68cad7f4c11659100a9088574ba36f6ec108d8c93b01c83960fcf2
5
5
  SHA512:
6
- metadata.gz: 99f8e91118aa0ce5225e4906df71176201f580e2910edc815ff5472dfd7f8cf8e7806038e8f6178b4451c34305be8193589c464f90a236f4a9430788f27811f6
7
- data.tar.gz: 9fe7809595bcf2249bfea75cb1ad62e811079e7f2a6e2e4f191c5470a42470de9280a3997dc21ff770a7872ee78ced64545f4f6168314de36831d1f0aae8a61e
6
+ metadata.gz: 4960e7f832c1463219ab949edcb2642f3079ff8eda2cfbc5f0b2c301c45e3c6607a2f02cfb999396aad4c3b4ab1e492faa2ceb7458421cff5042484ea1f81f45
7
+ data.tar.gz: bd52ce9e9d80cce6c50e841911861f10ee841701dd50f97651bab2d0e8427da499d532c5c74decbf5f0f53d0c51b81caeec1fe33e64d5616a33b6ed7e6724d24
data/bin/cfn_manage.rb CHANGED
@@ -62,6 +62,10 @@ OptionParser.new do |opts|
62
62
  ENV['DRY_RUN'] = '1'
63
63
  end
64
64
 
65
+ opts.on('--continue-on-error') do
66
+ ENV['CFN_CONTINUE_ON_ERROR'] = '1'
67
+ end
68
+
65
69
  end.parse!
66
70
 
67
71
  command = ARGV[0]
data/bin/usage.txt CHANGED
@@ -39,4 +39,11 @@ General options
39
39
 
40
40
  Applicable only to [start|stop-environment] commands. If dry run is enabled
41
41
  info about assets being started / stopped will ne only printed to standard output,
42
- without any action taken.
42
+ without any action taken.
43
+
44
+ --continue-on-error
45
+
46
+ Applicable only to [start|stop-environment] commands. If there is problem with stopping a resource,
47
+ (e.g. cloudformation stack not being synced or manual resource deletion) script will continue it's
48
+ operation. By defult script stops when there is problem with starting/stopping resource, and expects
49
+ manual intervention to fix the root cause for failure.
@@ -1,4 +1,4 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-core'
2
2
 
3
3
  module Base2
4
4
 
@@ -1,4 +1,4 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-cloudformation'
2
2
  require_relative './cf_common'
3
3
 
4
4
  module Base2
@@ -1,4 +1,11 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-ec2'
2
+ require 'aws-sdk-s3'
3
+ require 'aws-sdk-ec2'
4
+ require 'aws-sdk-cloudformation'
5
+ require 'aws-sdk-rds'
6
+ require 'aws-sdk-cloudwatch'
7
+ require 'aws-sdk-autoscaling'
8
+
2
9
  require_relative '../lib/cf_common'
3
10
  require_relative '../lib/aws_credentials'
4
11
  require 'json'
@@ -33,6 +40,7 @@ module Base2
33
40
  @cf_client = Aws::CloudFormation::Client.new(credentials: @credentials, retry_limit: 20)
34
41
  end
35
42
  @dry_run = (ENV.key?('DRY_RUN') and ENV['DRY_RUN'] == '1')
43
+ @continue_on_error = (ENV.key? 'CFN_CONTINUE_ON_ERROR' and ENV['CFN_CONTINUE_ON_ERROR'] == '1')
36
44
  end
37
45
 
38
46
 
@@ -41,7 +49,7 @@ module Base2
41
49
  Common.visit_stack(@cf_client, stack_name, method(:collect_resources), true)
42
50
  do_start_assets
43
51
  configuration = { stack_running: true }
44
- save_item_configuration("environment-data/stack-data/#{stack_name}", configuration) unless @dry_run
52
+ save_item_configuration("environment_data/stack-#{stack_name}", configuration) unless @dry_run
45
53
  $log.info("Environment #{stack_name} started")
46
54
  end
47
55
 
@@ -51,7 +59,7 @@ module Base2
51
59
  Common.visit_stack(@cf_client, stack_name, method(:collect_resources), true)
52
60
  do_stop_assets
53
61
  configuration = { stack_running: false }
54
- save_item_configuration("environment-data/stack-data/#{stack_name}", configuration) unless @dry_run
62
+ save_item_configuration("environment_data/stack-#{stack_name}", configuration) unless @dry_run
55
63
  $log.info("Environment #{stack_name} stopped")
56
64
  end
57
65
 
@@ -61,17 +69,26 @@ module Base2
61
69
  @environment_resources = @environment_resources.sort_by { |k| k[:priority] }.reverse
62
70
 
63
71
  @environment_resources.each do |resource|
64
- $log.info("Stopping resource #{resource[:id]}")
65
- # just print out information if running a dry run, otherwise start assets
66
- if not @dry_run
67
- configuration = resource[:handler].stop()
68
- if configuration.class == Hash
69
- s3_prefix = "environment_data/resource/#{resource[:id]}"
70
- save_item_configuration(s3_prefix, configuration)
72
+ begin
73
+ $log.info("Stopping resource #{resource[:id]}")
74
+ # just print out information if running a dry run, otherwise start assets
75
+ if not @dry_run
76
+ configuration = resource[:handler].stop()
77
+ if configuration.class == Hash
78
+ s3_prefix = "environment_data/resource/#{resource[:id]}"
79
+ save_item_configuration(s3_prefix, configuration)
80
+ end
81
+ else
82
+ $log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
83
+ $log.debug("Resource type: #{resource[:type]}\n\n")
84
+ end
85
+ rescue => e
86
+ $log.error("An exception occurred during stop operation against resource #{resource[:id]}")
87
+ $log.error("#{e.to_s}")
88
+ $log.error(e.backtrace.join("\n\t"))
89
+ if not @continue_on_error
90
+ raise e
71
91
  end
72
- else
73
- $log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
74
- $log.debug("Resource type: #{resource[:type]}\n\n")
75
92
  end
76
93
  end
77
94
  end
@@ -81,18 +98,27 @@ module Base2
81
98
  @environment_resources = @environment_resources.sort_by { |k| k[:priority] }
82
99
 
83
100
  @environment_resources.each do |resource|
84
- $log.info("Starting resource #{resource[:id]}")
85
- # just print out information if running a dry run, otherwise start assets
86
- if not @dry_run
87
- # read configuration
88
- s3_prefix = "environment_data/resource/#{resource[:id]}"
89
- configuration = get_object_configuration(s3_prefix)
90
-
91
- # start
92
- resource[:handler].start(configuration)
93
- else
94
- $log.info("Dry run enabled, skipping actual start\nFollowing resource would be started: #{resource[:id]}")
95
- $log.debug("Resource type: #{resource[:type]}\n\n")
101
+ begin
102
+ $log.info("Starting resource #{resource[:id]}")
103
+ # just print out information if running a dry run, otherwise start assets
104
+ if not @dry_run
105
+ # read configuration
106
+ s3_prefix = "environment_data/resource/#{resource[:id]}"
107
+ configuration = get_object_configuration(s3_prefix)
108
+
109
+ # start
110
+ resource[:handler].start(configuration)
111
+ else
112
+ $log.info("Dry run enabled, skipping actual start\nFollowing resource would be started: #{resource[:id]}")
113
+ $log.debug("Resource type: #{resource[:type]}\n\n")
114
+ end
115
+ rescue => e
116
+ $log.error("An exception occurred during start operation against resource #{resource[:id]}")
117
+ $log.error("#{e.to_s}")
118
+ $log.error(e.backtrace.join("\n\t"))
119
+ if not @continue_on_error
120
+ raise e
121
+ end
96
122
  end
97
123
  end
98
124
  end
@@ -0,0 +1,53 @@
1
+ require_relative '../lib/aws_credentials'
2
+
3
+ module Base2
4
+
5
+ class DynamoDbStartStopHandler
6
+
7
+ @table
8
+ @table_name
9
+ @gsi_names
10
+
11
+ def initialize(table_name)
12
+ credentials = Base2::AWSCredentials.get_session_credentials("stoprun_#{instance_id}")
13
+ ec2_client = Aws::DynamoDB::Client.new(credentials: credentials)
14
+ @table = Aws::DynamoDB::Resource.new(client: ec2_client).table(table_name)
15
+ @table_name = table_name
16
+ @table.global_secondary_indexes.each do |gsi|
17
+ @gsi_names << gsi.index_name
18
+ end
19
+ end
20
+
21
+ def start(configuration)
22
+
23
+ end
24
+
25
+ def stop
26
+ configuration = {
27
+ read_capacity: @table.provisioned_throughput.read_capacity_units,
28
+ write_capacity: @table.provisioned_throughput.write_capacity_units
29
+ }
30
+
31
+ $log.info("Current dynamo table #{@table.name} capacity: #{configuration}")
32
+
33
+ # check if environment vairable set for
34
+ if ENV.key? ('cfn_manage_dynamodb_stop_capacity')
35
+ stop_capacity = ENV['cfn_manage_dynamodb_stop_capacity'].to_i
36
+
37
+ $log.info("Downsizing read/write capacity to #{stop_capacity}")
38
+ @table.update({
39
+ provisioned_throughput: {
40
+ read_capacity_units: stop_capacity, # required
41
+ write_capacity_units: stop_capacity, # required
42
+ }
43
+ })
44
+ end
45
+
46
+
47
+
48
+ configuration
49
+ end
50
+
51
+
52
+ end
53
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfn_manage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Base2Services
@@ -9,13 +9,13 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-12-06 00:00:00.000000000 Z
12
+ date: 2018-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: aws-sdk
15
+ name: aws-sdk-core
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '3'
21
21
  - - "<"
@@ -25,12 +25,152 @@ dependencies:
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - ">="
28
+ - - "~>"
29
29
  - !ruby/object:Gem::Version
30
30
  version: '3'
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4'
34
+ - !ruby/object:Gem::Dependency
35
+ name: aws-sdk-s3
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - - "<"
42
+ - !ruby/object:Gem::Version
43
+ version: '2'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '1'
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '2'
54
+ - !ruby/object:Gem::Dependency
55
+ name: aws-sdk-ec2
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1'
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '2'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1'
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '2'
74
+ - !ruby/object:Gem::Dependency
75
+ name: aws-sdk-cloudformation
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1'
81
+ - - "<"
82
+ - !ruby/object:Gem::Version
83
+ version: '2'
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1'
91
+ - - "<"
92
+ - !ruby/object:Gem::Version
93
+ version: '2'
94
+ - !ruby/object:Gem::Dependency
95
+ name: aws-sdk-rds
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1'
101
+ - - "<"
102
+ - !ruby/object:Gem::Version
103
+ version: '2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
111
+ - - "<"
112
+ - !ruby/object:Gem::Version
113
+ version: '2'
114
+ - !ruby/object:Gem::Dependency
115
+ name: aws-sdk-cloudwatch
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '1'
121
+ - - "<"
122
+ - !ruby/object:Gem::Version
123
+ version: '2'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1'
131
+ - - "<"
132
+ - !ruby/object:Gem::Version
133
+ version: '2'
134
+ - !ruby/object:Gem::Dependency
135
+ name: aws-sdk-iam
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '1'
141
+ - - "<"
142
+ - !ruby/object:Gem::Version
143
+ version: '2'
144
+ type: :runtime
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '1'
151
+ - - "<"
152
+ - !ruby/object:Gem::Version
153
+ version: '2'
154
+ - !ruby/object:Gem::Dependency
155
+ name: aws-sdk-autoscaling
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '1'
161
+ - - "<"
162
+ - !ruby/object:Gem::Version
163
+ version: '2'
164
+ type: :runtime
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '1'
171
+ - - "<"
172
+ - !ruby/object:Gem::Version
173
+ version: '2'
34
174
  description: ''
35
175
  email: itsupport@base2services.com
36
176
  executables:
@@ -47,6 +187,7 @@ files:
47
187
  - lib/cf_common.rb
48
188
  - lib/cf_progress_tracker.rb
49
189
  - lib/cf_start_stop_environment.rb
190
+ - lib/dynamodb_start_stop_handler.rb
50
191
  - lib/ec2_start_stop_handler.rb
51
192
  - lib/rds_start_stop_handler.rb
52
193
  - lib/start_stop_handler_factory.rb
@@ -70,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
211
  version: '0'
71
212
  requirements: []
72
213
  rubyforge_project:
73
- rubygems_version: 2.6.8
214
+ rubygems_version: 2.7.6
74
215
  signing_key:
75
216
  specification_version: 4
76
217
  summary: Manage AWS Cloud Formation stacks