opsworks_interactor 0.0.2 → 0.0.3

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/opsworks_interactor.rb +34 -15
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2edb5040ef5bae49462f4ed304c48364612a81db
4
- data.tar.gz: 6d9f5f5bbdaaf57a72da4a9518f155b5b254319b
3
+ metadata.gz: f97a42f30cb55c2e5f1937ad59db3d5b23d315e1
4
+ data.tar.gz: fedbbe8f5eb7dfea2e37634e9974344caa6ca651
5
5
  SHA512:
6
- metadata.gz: 9b993c23b0565320222cc693970707beed88b9bbb8848b6adb482f74525b24471e510e4d9b839f4c51154cda56d541451fa3145924ffe6348058602764145c69
7
- data.tar.gz: 637318ed99bd11f344b339c858b0c66134cf68a32dbd057086c40e1a13be9f42eb37584b343ac0de2a2ae11f0fcc1d760836fd652274e2af581387db7bb5646b
6
+ metadata.gz: eb8b867c041410e7a034f0980a5b1c708567f68facb11384af57f1634a512f861d25649dfe785f69aece6dca05e18f3f0d4c87d06e07bbbdd6681cf6703c65d1
7
+ data.tar.gz: 2d9e4dcaf2f646acd9a3603e9bf8a3c939185e170dc0e57685596f20be49940607a1085eece458ef8059bc93c8c51ffadb8622ca20cd94d95efa4d6a123956b3
@@ -1,5 +1,7 @@
1
1
  require 'aws-sdk'
2
2
  class OpsworksInteractor
3
+ Aws::Waiters::Errors::TimeoutError = Class.new(Aws::Waiters::Errors::WaiterFailed)
4
+
3
5
  begin
4
6
  require 'redis-semaphore'
5
7
  rescue LoadError
@@ -46,7 +48,7 @@ class OpsworksInteractor
46
48
  # Blocks until AWS confirms that the deploy was successful
47
49
  #
48
50
  # Returns a Aws::OpsWorks::Types::CreateDeploymentResult
49
- def deploy(stack_id:, app_id:, instance_id:)
51
+ def deploy(stack_id:, app_id:, instance_id:, deploy_timeout: 30.minutes)
50
52
  response = @opsworks_client.create_deployment(
51
53
  stack_id: stack_id,
52
54
  app_id: app_id,
@@ -61,10 +63,8 @@ class OpsworksInteractor
61
63
 
62
64
  log("Deploy process running (id: #{response[:deployment_id]})...")
63
65
 
64
- @opsworks_client.wait_until(
65
- :deployment_successful,
66
- deployment_ids: [response[:deployment_id]]
67
- )
66
+ wait_until_deploy_completion(response[:deployment_id], deploy_timeout)
67
+ end
68
68
 
69
69
  log("✓ deploy completed")
70
70
 
@@ -73,6 +73,23 @@ class OpsworksInteractor
73
73
 
74
74
  private
75
75
 
76
+ # Polls Opsworks for timeout seconds until deployment_id has completed
77
+ def wait_until_deploy_completion(deployment_id, timeout)
78
+ started_at = Time.now
79
+
80
+ @opsworks_client.wait_until(
81
+ :deployment_successful,
82
+ deployment_ids: [deployment_id]
83
+ ) do |w|
84
+ # disable max attempts
85
+ w.max_attempts = nil
86
+ # poll for a time period, instead of a number of attempts
87
+ before_wait do |attempts, response|
88
+ raise Aws::Waiters::Errors::TimeoutError if (Time.now - started_at) > timeout
89
+ end
90
+ end
91
+ end
92
+
76
93
  # Loop through all instances in layer
77
94
  # Deregister from ELB (elastic load balancer)
78
95
  # Wait connection draining timeout (default up to maximum of 300s)
@@ -86,19 +103,21 @@ class OpsworksInteractor
86
103
  instances = @opsworks_client.describe_instances(layer_id: layer_id)[:instances]
87
104
 
88
105
  instances.each do |instance|
89
- log("=== Starting deploy for #{instance.hostname} ===")
90
-
91
- load_balancers = detach_from_elbs(instance: instance)
106
+ begin
107
+ log("=== Starting deploy for #{instance.hostname} ===")
92
108
 
93
- deploy(
94
- stack_id: stack_id,
95
- app_id: app_id,
96
- instance_id: instance.instance_id
97
- )
109
+ load_balancers = detach_from_elbs(instance: instance)
98
110
 
99
- attach_to_elbs(instance: instance, load_balancers: load_balancers)
111
+ deploy(
112
+ stack_id: stack_id,
113
+ app_id: app_id,
114
+ instance_id: instance.instance_id
115
+ )
116
+ ensure
117
+ attach_to_elbs(instance: instance, load_balancers: load_balancers) if load_blaancers
100
118
 
101
- log("=== Done deploying on #{instance.hostname} ===\n\n")
119
+ log("=== Done deploying on #{instance.hostname} ===\n\n")
120
+ end
102
121
  end
103
122
 
104
123
  log("SUCCESS: completed opsworks deploy for all instances on app #{app_id}")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opsworks_interactor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Davies