cfn_manage 0.4.3 → 0.5.0

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: 3c9938fbe475e8c39793a88a94253a0ed956ed08
4
- data.tar.gz: 2d939e4715fff3bd538e35e39bf5b0d91b70d3cd
2
+ SHA256:
3
+ metadata.gz: 069e9448ce6f6efafd546df321dd4dbb52503f73586d23f718dc10c211e0de36
4
+ data.tar.gz: 9cb836b6ea9b0071743386dd7fe030c6c3f013b1be2270671b1df31722b0a2ea
5
5
  SHA512:
6
- metadata.gz: ad06bdd60a71c78474bcb188abf2b08677f6e0fca11431f751f466c0930f1cc72f6d2a98ef7a20f59675ff6eb6018f2d4dc44873d66731b14b0760165937c705
7
- data.tar.gz: 0a634fcb6c0f229ba3ce36c85c33f84f68618f390111f96b0c2dc38cb1e420d4663c45c959bd557c6462b49aa897a3b9439c090f57b53727d8f389bbdf0ec229
6
+ metadata.gz: a8e2ae95ea5bb3600a46cc637a32f969831190ea2b3cf3d8553a7ee9e4f726ad6aab360f7cc389f08e2fd1df7a1c507cde5e7a9142b79179359590c908048424
7
+ data.tar.gz: 7d2dcc801ce2c239519fcc8f410b4f2395f56963c8b89e8b2d169131b00f588126b1aa65ccb5a1bff91d6f4434f562ee535b3609e4f6c2585fed195f4ff338c2
data/bin/cfn_manage CHANGED
@@ -1,2 +1,158 @@
1
1
  #!/usr/bin/env ruby
2
- require_relative('./cfn_manage')
2
+ require 'optparse'
3
+ require 'cfn_manage/version'
4
+ require 'cfn_manage/cf_common'
5
+ require 'cfn_manage/cf_start_stop_environment'
6
+ require 'logger'
7
+
8
+ # exit with usage information
9
+ def print_usage_exit(code)
10
+ STDERR.puts(File.open("#{File.expand_path(File.dirname(__FILE__))}/usage.txt").read)
11
+ exit code
12
+ end
13
+
14
+ # global options
15
+ $options = {}
16
+ $options['SOURCE_BUCKET'] = ENV['SOURCE_BUCKET']
17
+ $options['AWS_ASSUME_ROLE'] = ENV['AWS_ASSUME_ROLE']
18
+
19
+ # global logger
20
+ $log = Logger.new(STDOUT)
21
+
22
+ # always flush output
23
+ STDOUT.sync = true
24
+
25
+ # parse command line options
26
+ OptionParser.new do |opts|
27
+
28
+ Version = CfnManage::VERSION
29
+
30
+ opts.banner = 'Usage: cfn_manage [command] [options]'
31
+
32
+ opts.on('--source-bucket [BUCKET]') do |bucket|
33
+ $options['SOURCE_BUCKET'] = bucket
34
+ ENV['SOURCE_BUCKET'] = bucket
35
+ end
36
+
37
+ opts.on('--aws-role [ROLE]') do |role|
38
+ ENV['AWS_ASSUME_ROLE'] = role
39
+ end
40
+
41
+ opts.on('--stack-name [STACK_NAME]') do |stack|
42
+ $options['STACK_NAME'] = stack
43
+ end
44
+
45
+ opts.on('--asg-name [ASG]') do |asg|
46
+ $options['ASG'] = asg
47
+ end
48
+
49
+ opts.on('--rds-instance-id [RDS_INSTANCE_ID]') do |rds|
50
+ $options['RDS_INSTANCE_ID'] = rds
51
+ end
52
+
53
+ opts.on('--aurora-cluster-id [AURORA_CLUSTER_ID]') do |cluster|
54
+ $options['AURORA_CLUSTER_ID'] = cluster
55
+ end
56
+
57
+ opts.on('--ec2-instance-id [EC2_INSTANCE_ID]') do |ec2|
58
+ $options['EC2_INSTANCE_ID'] = ec2
59
+ end
60
+
61
+ opts.on('--spot-fleet-id [SPOT_FLEET]') do |spot|
62
+ $options['SPOT_FLEET'] = spot
63
+ end
64
+
65
+ opts.on('--ecs-cluster [ECS_CLUSTER]') do |ecs|
66
+ $options['ECS_CLUSTER'] = ecs
67
+ end
68
+
69
+ opts.on('--alarm [ALARM]') do |alarm|
70
+ $options['ALARM'] = alarm
71
+ end
72
+
73
+ opts.on('-r [AWS_REGION]', '--region [AWS_REGION]') do |region|
74
+ ENV['AWS_REGION'] = region
75
+ end
76
+
77
+ opts.on('-p [AWS_PROFILE]', '--profile [AWS_PROFILE]') do |profile|
78
+ ENV['CFN_AWS_PROFILE'] = profile
79
+ end
80
+
81
+ opts.on('--dry-run') do
82
+ ENV['DRY_RUN'] = '1'
83
+ end
84
+
85
+ opts.on('--continue-on-error') do
86
+ ENV['CFN_CONTINUE_ON_ERROR'] = '1'
87
+ end
88
+
89
+ opts.on('--wait-async') do
90
+ ENV['WAIT_ASYNC'] = '1'
91
+ ENV['SKIP_WAIT'] = '1'
92
+ end
93
+
94
+ opts.on('--skip_wait') do
95
+ ENV['SKIP_WAIT'] = '1'
96
+ end
97
+
98
+ end.parse!
99
+
100
+ command = ARGV[0]
101
+
102
+ if command.nil?
103
+ print_usage_exit(-1)
104
+ end
105
+
106
+ # execute action based on command
107
+ case command
108
+ when 'help'
109
+ print_usage_exit(0)
110
+ # asg commands
111
+ when 'stop-asg'
112
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ASG'],'AWS::AutoScaling::AutoScalingGroup')
113
+ when 'start-asg'
114
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ASG'],'AWS::AutoScaling::AutoScalingGroup')
115
+
116
+ # rds commands
117
+ when 'stop-rds'
118
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['RDS_INSTANCE_ID'],'AWS::RDS::DBInstance')
119
+ when 'start-rds'
120
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['RDS_INSTANCE_ID'],'AWS::RDS::DBInstance')
121
+
122
+ # aurora cluster commands
123
+ when 'stop-aurora-cluster'
124
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['AURORA_CLUSTER_ID'],'AWS::RDS::DBCluster')
125
+ when 'start-aurora-cluster'
126
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['AURORA_CLUSTER_ID'],'AWS::RDS::DBCluster')
127
+
128
+ # ec2 instance
129
+ when 'stop-ec2'
130
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['EC2_INSTANCE_ID'],'AWS::EC2::Instance')
131
+ when 'start-ec2'
132
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['EC2_INSTANCE_ID'],'AWS::EC2::Instance')
133
+
134
+ # spot fleet
135
+ when 'stop-spot-fleet'
136
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['SPOT_FLEET'],'AWS::EC2::SpotFleet')
137
+ when 'start-spot-fleet'
138
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['SPOT_FLEET'],'AWS::EC2::SpotFleet')
139
+
140
+ # spot fleet
141
+ when 'stop-ecs-cluster'
142
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ECS_CLUSTER'],'AWS::ECS::Cluster')
143
+ when 'start-ecs-cluster'
144
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ECS_CLUSTER'],'AWS::ECS::Cluster')
145
+
146
+
147
+ # cloudwatch alarm
148
+ when 'disable-alarm'
149
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ALARM'],'AWS::CloudWatch::Alarm')
150
+ when 'enable-alarm'
151
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_resource($options['ALARM'],'AWS::CloudWatch::Alarm')
152
+
153
+ # stack commands
154
+ when 'stop-environment'
155
+ CfnManage::CloudFormation::EnvironmentRunStop.new().stop_environment($options['STACK_NAME'])
156
+ when 'start-environment'
157
+ CfnManage::CloudFormation::EnvironmentRunStop.new().start_environment($options['STACK_NAME'])
158
+ end
data/bin/usage.txt CHANGED
@@ -2,6 +2,10 @@ Usage: cfn_manage [command] [options]
2
2
 
3
3
  Commands:
4
4
 
5
+ cfn_manage help
6
+
7
+ cfn_manage version
8
+
5
9
  cfn_manage stop-environment --stack-name [STACK_NAME]
6
10
 
7
11
  cfn_manage start-environment --stack-name [STACK_NAME]
@@ -18,7 +22,23 @@ cfn_manage stop-aurora-cluster --aurora-cluster-id [AURORA_CLUSTER_ID]
18
22
 
19
23
  cfn_manage start-aurora-cluster --aurora-cluster-id [AURORA_CLUSTER_ID]
20
24
 
21
- General options
25
+ cfn_manage stop-ec2 --ec2-instance-id [EC2_INSTANCE_ID]
26
+
27
+ cfn_manage start-ec2 --ec2-instance-id [EC2_INSTANCE_ID]
28
+
29
+ cfn_manage stop-spot-fleet --spot-fleet [SPOT_FLEET]
30
+
31
+ cfn_manage start-spot-fleet --spot-fleet [SPOT_FLEET]
32
+
33
+ cfn_manage stop-ecs-cluster --ecs-cluster [ECS_CLUSTER]
34
+
35
+ cfn_manage start-ecs-cluster --ecs-cluster [ECS_CLUSTER]
36
+
37
+ cfn_manage disable-alarm --alarm [ALARM]
38
+
39
+ cfn_manage enable-alarm --alarm [ALARM]
40
+
41
+ General options:
22
42
 
23
43
  --source-bucket [BUCKET]
24
44
 
@@ -48,5 +68,15 @@ General options
48
68
 
49
69
  Applicable only to [start|stop-environment] commands. If there is problem with stopping a resource,
50
70
  (e.g. cloudformation stack not being synced or manual resource deletion) script will continue it's
51
- operation. By defult script stops when there is problem with starting/stopping resource, and expects
71
+ operation. By default script stops when there is problem with starting/stopping resource, and expects
52
72
  manual intervention to fix the root cause for failure.
73
+
74
+ --skip-wait
75
+
76
+ Skips waiting for resources to achieve stopped or started states.
77
+
78
+ --wait-async
79
+
80
+ Default wait action is to wait for each individual resource to be stopped and started before continuing.
81
+ This will enabled waiting for resources in groups based on priority. Option only useful when used with
82
+ start-environment and stop-environment commands.
data/lib/cfn_manage.rb ADDED
@@ -0,0 +1 @@
1
+ module CfnManage; end
@@ -1,12 +1,12 @@
1
- require_relative '../lib/aws_credentials'
1
+ require 'cfn_manage/aws_credentials'
2
2
 
3
- module Base2
3
+ module CfnManage
4
4
 
5
5
  class AlarmStartStopHandler
6
6
 
7
7
  def initialize(alarm_name)
8
8
  @alarm_id = alarm_name
9
- credentials = Base2::AWSCredentials.get_session_credentials("startstopalarm_#{@asg_name}")
9
+ credentials = CfnManage::AWSCredentials.get_session_credentials("startstopalarm_#{@asg_name}")
10
10
  @cwclient = Aws::CloudWatch::Client.new(retry_limit: 20)
11
11
  if credentials != nil
12
12
  @cwclient = Aws::CloudWatch::Client.new(credentials: credentials, retry_limit: 20)
@@ -34,6 +34,11 @@ module Base2
34
34
  @alarm.disable_actions({})
35
35
  return {}
36
36
  end
37
+
38
+ def wait(wait_states=[])
39
+ $log.debug("Not waiting for alarm #{@alarm_id}")
40
+ end
41
+
37
42
  end
38
43
 
39
- end
44
+ end
@@ -1,13 +1,13 @@
1
- require_relative '../lib/aws_credentials'
1
+ require 'cfn_manage/aws_credentials'
2
2
 
3
- module Base2
3
+ module CfnManage
4
4
 
5
5
  class AsgStartStopHandler
6
6
 
7
- def initialize(asg_id)
7
+ def initialize(asg_id, skip_wait)
8
8
  @asg_name = asg_id
9
-
10
- credentials = Base2::AWSCredentials.get_session_credentials("stopasg_#{@asg_name}")
9
+ @skip_wait = skip_wait
10
+ credentials = CfnManage::AWSCredentials.get_session_credentials("stopasg_#{@asg_name}")
11
11
  @asg_client = Aws::AutoScaling::Client.new(retry_limit: 20)
12
12
  if credentials != nil
13
13
  @asg_client = Aws::AutoScaling::Client.new(credentials: credentials, retry_limit: 20)
@@ -66,5 +66,9 @@ module Base2
66
66
  })
67
67
  end
68
68
 
69
+ def wait(wait_states=[])
70
+ $log.debug("Not waiting for ASG #{@asg_name}")
71
+ end
72
+
69
73
  end
70
- end
74
+ end
@@ -1,13 +1,13 @@
1
- require_relative '../lib/aws_credentials'
1
+ require 'cfn_manage/aws_credentials'
2
2
 
3
- module Base2
3
+ module CfnManage
4
4
 
5
5
  class AuroraClusterStartStopHandler
6
6
 
7
- def initialize(cluster_id)
7
+ def initialize(cluster_id, skip_wait)
8
8
  @cluster_id = cluster_id
9
-
10
- credentials = Base2::AWSCredentials.get_session_credentials("startstopcluster_#{cluster_id}")
9
+ @skip_wait = skip_wait
10
+ credentials = CfnManage::AWSCredentials.get_session_credentials("startstopcluster_#{cluster_id}")
11
11
  @rds_client = Aws::RDS::Client.new(retry_limit: 20)
12
12
  if credentials != nil
13
13
  @rds_client = Aws::RDS::Client.new(credentials: credentials, retry_limit: 20)
@@ -27,10 +27,11 @@ module Base2
27
27
  if @rds_cluster.status == 'stopped'
28
28
  $log.info("Starting Aurora cluster #{@cluster_id}")
29
29
  @rds_client.start_db_cluster({ db_cluster_identifier: @cluster_id })
30
-
31
- # wait cluster to become available
32
- $log.info("Waiting Aurora cluster to become available #{@cluster_id}")
33
- wait_rds_cluster_states( %w(starting available))
30
+ unless @skip_wait
31
+ # wait cluster to become available
32
+ $log.info("Waiting Aurora cluster to become available #{@cluster_id}")
33
+ wait('available')
34
+ end
34
35
  else
35
36
  $log.info("Aurora Cluster #{@cluster_id} is not in a stopped state. State: #{@rds_cluster.status}")
36
37
  end
@@ -46,41 +47,39 @@ module Base2
46
47
  $log.info("Aurora Cluster #{@cluster_id} is not in a available state. State: #{@rds_cluster.status}")
47
48
  return {}
48
49
  end
49
-
50
50
  # stop rds cluster and wait for it to be fully stopped
51
51
  $log.info("Stopping aurora cluster #{@cluster_id}")
52
52
  @rds_client.stop_db_cluster({ db_cluster_identifier: @cluster_id })
53
- $log.info("Waiting aurora cluster to be stopped #{@cluster_id}")
54
- wait_rds_cluster_states(%w(stopping stopped))
55
-
53
+ unless @skip_wait
54
+ $log.info("Waiting aurora cluster to be stopped #{@cluster_id}")
55
+ wait('stopped')
56
+ end
56
57
  return {}
57
58
  end
58
59
 
59
- def wait_rds_cluster_states(wait_states=[])
60
- wait_states.each do |state|
61
- # reached state must be steady, at least a minute.
62
- state_count = 0
63
- steady_count = 4
64
- attempts = 0
65
- rds = Aws::RDS::Resource.new(client: @rds_client)
66
- until attempts == (max_attempts = 60*6) do
67
- cluster = rds.db_cluster(@cluster_id)
68
- $log.info("Aurora Cluster #{cluster.db_cluster_identifier} state: #{cluster.status}, waiting for #{state}")
69
-
70
- if cluster.status == "#{state}"
71
- state_count = state_count + 1
72
- $log.info("#{state_count}/#{steady_count}")
73
- else
74
- state_count = 0
75
- end
76
- break if state_count == steady_count
77
- attempts = attempts + 1
78
- sleep(15)
60
+ def wait(completed_state)
61
+ # reached state must be steady, at least a minute.
62
+ state_count = 0
63
+ steady_count = 4
64
+ attempts = 0
65
+ rds = Aws::RDS::Resource.new(client: @rds_client)
66
+ until attempts == (max_attempts = 60*6) do
67
+ cluster = rds.db_cluster(@cluster_id)
68
+ $log.info("Aurora Cluster #{cluster.db_cluster_identifier} state: #{cluster.status}, waiting for #{completed_state}")
69
+
70
+ if cluster.status == "#{completed_state}"
71
+ state_count = state_count + 1
72
+ $log.info("#{state_count}/#{steady_count}")
73
+ else
74
+ state_count = 0
79
75
  end
76
+ break if state_count == steady_count
77
+ attempts = attempts + 1
78
+ sleep(15)
79
+ end
80
80
 
81
- if attempts == max_attempts
82
- $log.error("RDS Aurora Cluster #{@cluster_id} did not enter #{state} state, however continuing operations...")
83
- end
81
+ if attempts == max_attempts
82
+ $log.error("RDS Aurora Cluster #{@cluster_id} did not enter #{state} state, however continuing operations...")
84
83
  end
85
84
  end
86
85
 
@@ -1,6 +1,6 @@
1
1
  require 'aws-sdk-core'
2
2
 
3
- module Base2
3
+ module CfnManage
4
4
 
5
5
  class AWSCredentials
6
6
 
@@ -33,4 +33,4 @@ module Base2
33
33
 
34
34
  end
35
35
  end
36
- end
36
+ end
@@ -1,4 +1,4 @@
1
- module Base2
1
+ module CfnManage
2
2
 
3
3
  module CloudFormation
4
4
 
@@ -1,7 +1,7 @@
1
1
  require 'aws-sdk-cloudformation'
2
- require_relative './cf_common'
2
+ require 'cfn_manage/cf_common'
3
3
 
4
- module Base2
4
+ module CfnManage
5
5
  module CloudFormation
6
6
  class ProgressTracker
7
7
  @cf_client = nil
@@ -34,17 +34,17 @@ module Base2
34
34
  @period_from = period_from
35
35
  end
36
36
 
37
-
37
+
38
38
  def track_single_stack(stack)
39
39
  stack_id = stack['stack_id']
40
40
  # Default to period_from if first run, take from last run otherwise
41
41
  event_from = last_event_times[stack_id] if @last_event_times.key?(stack_id)
42
42
  event_from = @period_from unless @last_event_times.key?(stack_id)
43
-
43
+
44
44
 
45
45
  stack_resources = @cf_client.describe_stack_events(stack_name: stack['stack_id'],)
46
-
47
-
46
+
47
+
48
48
  end
49
49
 
50
50
  def track_progress(_show_only_failures = false)
@@ -5,14 +5,15 @@ require 'aws-sdk-cloudformation'
5
5
  require 'aws-sdk-rds'
6
6
  require 'aws-sdk-cloudwatch'
7
7
  require 'aws-sdk-autoscaling'
8
+ require 'aws-sdk-ecs'
8
9
 
9
- require_relative '../lib/cf_common'
10
- require_relative '../lib/aws_credentials'
10
+ require 'cfn_manage/cf_common'
11
+ require 'cfn_manage/aws_credentials'
11
12
  require 'json'
12
13
  require 'yaml'
13
- require_relative '../lib/start_stop_handler_factory'
14
+ require 'cfn_manage/start_stop_handler_factory'
14
15
 
15
- module Base2
16
+ module CfnManage
16
17
  module CloudFormation
17
18
  class EnvironmentRunStop
18
19
 
@@ -29,6 +30,7 @@ module Base2
29
30
  'AWS::AutoScaling::AutoScalingGroup' => '200',
30
31
  'AWS::EC2::Instance' => '200',
31
32
  'AWS::EC2::SpotFleet' => '200',
33
+ 'AWS::ECS::Cluster' => '250',
32
34
  'AWS::CloudWatch::Alarm' => '300'
33
35
  }
34
36
 
@@ -37,11 +39,13 @@ module Base2
37
39
  @s3_client = Aws::S3::Client.new(retry_limit: 20)
38
40
  @s3_bucket = ENV['SOURCE_BUCKET']
39
41
  @cf_client = Aws::CloudFormation::Client.new(retry_limit: 20)
40
- @credentials = Base2::AWSCredentials.get_session_credentials('start_stop_environment')
42
+ @credentials = CfnManage::AWSCredentials.get_session_credentials('start_stop_environment')
41
43
  if not @credentials.nil?
42
44
  @cf_client = Aws::CloudFormation::Client.new(credentials: @credentials, retry_limit: 20)
43
45
  end
44
46
  @dry_run = (ENV.key?('DRY_RUN') and ENV['DRY_RUN'] == '1')
47
+ @skip_wait = (ENV.key?('SKIP_WAIT') and ENV['SKIP_WAIT'] == '1')
48
+ @wait_async = (ENV.key?('WAIT_ASYNC') and ENV['WAIT_ASYNC'] == '1')
45
49
  @continue_on_error = (ENV.key? 'CFN_CONTINUE_ON_ERROR' and ENV['CFN_CONTINUE_ON_ERROR'] == '1')
46
50
  rescue NoMethodError => e
47
51
  puts "Got No Method Error on CloudFormation::initialize, this often means that you're missing a AWS_DEFAULT_REGION"
@@ -69,92 +73,131 @@ module Base2
69
73
  $log.info("Environment #{stack_name} stopped")
70
74
  end
71
75
 
72
- def start_stop_aurora_cluster(action,cluster_id)
73
- start_stop_handler = Base2::StartStopHandlerFactory.get_start_stop_handler(
74
- 'AWS::RDS::DBCluster',
75
- cluster_id
76
+ def start_resource(resource_id,resource_type)
77
+ start_stop_handler = CfnManage::StartStopHandlerFactory.get_start_stop_handler(
78
+ resource_type,
79
+ resource_id,
80
+ @skip_wait
76
81
  )
77
82
  @environment_resources << {
78
- id: cluster_id,
79
- priority: '100',
83
+ id: resource_id,
84
+ priority: @@resource_start_priorities[resource['resource_type']],
80
85
  handler: start_stop_handler,
81
- type: 'AWS::RDS::DBCluster'
86
+ type: resource_type
82
87
  }
83
- do_stop_assets if action == 'stop'
84
- do_start_assets if action == 'start'
88
+ do_start_assets
85
89
  end
86
90
 
87
- def start_stop_rds(action,instance_id)
88
- start_stop_handler = Base2::StartStopHandlerFactory.get_start_stop_handler(
89
- 'AWS::RDS::DBInstance',
90
- instance_id
91
+ def stop_resource(resource_id,resource_type)
92
+ start_stop_handler = CfnManage::StartStopHandlerFactory.get_start_stop_handler(
93
+ resource_type,
94
+ resource_id,
95
+ @skip_wait
91
96
  )
92
97
  @environment_resources << {
93
- id: instance_id,
94
- priority: '100',
98
+ id: resource_id,
99
+ priority: @@resource_start_priorities[resource['resource_type']],
95
100
  handler: start_stop_handler,
96
- type: 'AWS::RDS::DBInstance'
101
+ type: resource_type
97
102
  }
98
- do_stop_assets if action == 'stop'
99
- do_start_assets if action == 'start'
103
+ do_stop_assets
100
104
  end
101
105
 
102
106
  def do_stop_assets
103
107
  # sort start resource by priority
104
108
  @environment_resources = @environment_resources.sort_by { |k| k[:priority] }.reverse
109
+ environment_resources_by_priority = @environment_resources.partition { |k| k[:priority] }
105
110
 
106
- @environment_resources.each do |resource|
107
- begin
108
- $log.info("Stopping resource #{resource[:id]}")
109
- # just print out information if running a dry run, otherwise start assets
110
- if not @dry_run
111
- configuration = resource[:handler].stop()
112
- if configuration.class == Hash
113
- s3_prefix = "environment_data/resource/#{resource[:id]}"
114
- save_item_configuration(s3_prefix, configuration)
111
+ environment_resources_by_priority.each do |priority|
112
+ priority.each do |resource|
113
+ begin
114
+ $log.info("Stopping resource #{resource[:id]}")
115
+ # just print out information if running a dry run, otherwise start assets
116
+ if not @dry_run
117
+ configuration = resource[:handler].stop()
118
+ if configuration.class == Hash
119
+ s3_prefix = "environment_data/resource/#{resource[:id]}"
120
+ save_item_configuration(s3_prefix, configuration)
121
+ end
122
+ else
123
+ $log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
124
+ $log.debug("Resource type: #{resource[:type]}\n\n")
125
+ end
126
+ rescue => e
127
+ $log.error("An exception occurred during stop operation against resource #{resource[:id]}")
128
+ $log.error("#{e.to_s}")
129
+ $log.error(e.backtrace.join("\n\t"))
130
+ if not @continue_on_error
131
+ raise e
115
132
  end
116
- else
117
- $log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
118
- $log.debug("Resource type: #{resource[:type]}\n\n")
119
133
  end
120
- rescue => e
121
- $log.error("An exception occurred during stop operation against resource #{resource[:id]}")
122
- $log.error("#{e.to_s}")
123
- $log.error(e.backtrace.join("\n\t"))
124
- if not @continue_on_error
125
- raise e
134
+ end
135
+
136
+ if not @dry_run and @wait_async
137
+ priority.each do |resource|
138
+ begin
139
+ resource[:handler].wait('stopped')
140
+ rescue => e
141
+ $log.error("An exception occurred during wait operation against resource #{resource[:id]}")
142
+ $log.error("#{e.to_s}")
143
+ $log.error(e.backtrace.join("\n\t"))
144
+ if not @continue_on_error
145
+ raise e
146
+ end
147
+ end
126
148
  end
127
149
  end
150
+
128
151
  end
129
152
  end
130
153
 
131
154
  def do_start_assets
132
155
  # sort start resource by priority
133
156
  @environment_resources = @environment_resources.sort_by { |k| k[:priority] }
157
+ environment_resources_by_priority = @environment_resources.partition { |k| k[:priority] }
134
158
 
135
- @environment_resources.each do |resource|
136
- begin
137
- $log.info("Starting resource #{resource[:id]}")
138
- # just print out information if running a dry run, otherwise start assets
139
- if not @dry_run
140
- # read configuration
141
- s3_prefix = "environment_data/resource/#{resource[:id]}"
142
- configuration = get_object_configuration(s3_prefix)
143
-
144
- # start
145
- resource[:handler].start(configuration)
146
- else
147
- $log.info("Dry run enabled, skipping actual start\nFollowing resource would be started: #{resource[:id]}")
148
- $log.debug("Resource type: #{resource[:type]}\n\n")
159
+ environment_resources_by_priority.each do |priority|
160
+ priority.each do |resource|
161
+ begin
162
+ $log.info("Starting resource #{resource[:id]}")
163
+ # just print out information if running a dry run, otherwise start assets
164
+ if not @dry_run
165
+ # read configuration
166
+ s3_prefix = "environment_data/resource/#{resource[:id]}"
167
+ configuration = get_object_configuration(s3_prefix)
168
+
169
+ # start
170
+ resource[:handler].start(configuration)
171
+ else
172
+ $log.info("Dry run enabled, skipping actual start\nFollowing resource would be started: #{resource[:id]}")
173
+ $log.debug("Resource type: #{resource[:type]}\n\n")
174
+ end
175
+ rescue => e
176
+ $log.error("An exception occurred during start operation against resource #{resource[:id]}")
177
+ $log.error("#{e.to_s}")
178
+ $log.error(e.backtrace.join("\n\t"))
179
+ if not @continue_on_error
180
+ raise e
181
+ end
149
182
  end
150
- rescue => e
151
- $log.error("An exception occurred during start operation against resource #{resource[:id]}")
152
- $log.error("#{e.to_s}")
153
- $log.error(e.backtrace.join("\n\t"))
154
- if not @continue_on_error
155
- raise e
183
+ end
184
+
185
+ if not @dry_run and @wait_async
186
+ priority.each do |resource|
187
+ begin
188
+ resource[:handler].wait('available')
189
+ rescue => e
190
+ $log.error("An exception occurred during wait operation against resource #{resource[:id]}")
191
+ $log.error("#{e.to_s}")
192
+ $log.error(e.backtrace.join("\n\t"))
193
+ if not @continue_on_error
194
+ raise e
195
+ end
156
196
  end
197
+ end
198
+
157
199
  end
200
+
158
201
  end
159
202
  end
160
203
 
@@ -163,9 +206,10 @@ module Base2
163
206
  resrouces['stack_resources'].each do |resource|
164
207
  start_stop_handler = nil
165
208
  begin
166
- start_stop_handler = Base2::StartStopHandlerFactory.get_start_stop_handler(
209
+ start_stop_handler = CfnManage::StartStopHandlerFactory.get_start_stop_handler(
167
210
  resource['resource_type'],
168
- resource['physical_resource_id']
211
+ resource['physical_resource_id'],
212
+ @skip_wait
169
213
  )
170
214
  rescue Exception => e
171
215
  $log.error("Error creating start-stop handler for resource of type #{resource['resource_type']}" +