cfn_manage 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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