qops 1.6.1 → 1.7.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: ae573e99371d225d3eca19d41a48f13a8a013819
4
- data.tar.gz: 7feba6d8f128cf7e6a62bf80cf5306d4827db491
2
+ SHA256:
3
+ metadata.gz: 56a8b43e8bf98e323bbda224d22ca5ad7fcbec726422924acfea24fe31125809
4
+ data.tar.gz: 5a2c7d2c3929dd29998cf5681decedf5cdec5435ce3b3961a8122cc07425619a
5
5
  SHA512:
6
- metadata.gz: 102be14735cf3aaf894bcc5b502f4c9bf5d9652651a592428f19978f779f740612bb6b74224273f39618427028a80c6e0f13dd4fc2a5b929d1b0959eec993831
7
- data.tar.gz: dfe5b532a6da97e65b66474267b843c50d4c1fb8d321ec4dc0ae2894b16a51eed086136b559f92958bd1eb1e59146a307022f5f9499a1689c4555d5b2d966dd9
6
+ metadata.gz: ed0c3e2e90a001a916f2e64e8395c35a51a3792dc55093033c494b067133205ad1f83a4d7418c92949539f5fe4ef221c54ad2a85758d9fe351cb538dfa22e256
7
+ data.tar.gz: 979bac6b722b0f07a45d6a995a00a15a6c17b3c905394f78f5a920bd1b38c2cab6fc531ad06aa3d4c4dc0290c08ec25284d2f980515fe9e7522e24bf2e091ffa
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
2
4
  require 'thor/group'
3
5
  require 'aws-sdk'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Cookbook < Thor
2
4
  include Qops::Helpers
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Deploy < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -8,9 +10,7 @@ class Qops::Deploy < Thor
8
10
  instances = config.deploy_type == 'staging' ? [retrieve_instance].compact : retrieve_instances
9
11
  online_instances = instances.select { |instance| instance.status == 'online' }
10
12
 
11
- if online_instances.empty?
12
- raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first'
13
- end
13
+ raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first' if online_instances.empty?
14
14
 
15
15
  if config.deploy_type == 'staging'
16
16
  puts "Preparing to deploy branch #{revision_used} to instance #{online_instances.first.hostname}"
@@ -32,9 +32,7 @@ class Qops::Deploy < Thor
32
32
  base_deployment_params[:app_id] = config.application_id
33
33
  end
34
34
 
35
- if config.deploy_type != 'production'
36
- base_deployment_params[:custom_json] = custom_json.to_json
37
- end
35
+ base_deployment_params[:custom_json] = custom_json.to_json if config.deploy_type != 'production'
38
36
 
39
37
  manifest = {
40
38
  environment: config.deploy_type
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::DeployHelpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -8,7 +10,8 @@ module Qops::DeployHelpers
8
10
  class_option :branch, type: :string, aliases: '-b', desc: 'The branch to use when deploying to staging type environments'
9
11
  class_option :hostname, type: :string, aliases: '-h', desc: 'Fully override the hostname that qops would normally give the instance'
10
12
  class_option :profile, type: :string, aliases: '-p', desc: 'An AWS profile to use'
11
- class_option :force_config, type: :boolean, aliases: '-f', desc: 'force qops to read options from config. by default qops will search aws opsworks stack'
13
+ class_option :force_config, type: :boolean, aliases: '-f', desc: 'Force qops to read options from config. by default qops will search aws opsworks stack'
14
+ class_option :verbose, type: :boolean, aliases: '-v', desc: 'Provides additional information when running for debugging purposes.'
12
15
  end
13
16
 
14
17
  private
@@ -16,7 +19,7 @@ module Qops::DeployHelpers
16
19
  def config
17
20
  return @_config if @_config
18
21
  Qops::Environment.notifiers
19
- @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config])
22
+ @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config], verbose: options[:verbose])
20
23
 
21
24
  fail "Invalid configure deploy_type detected: #{@_config.deploy_type}" unless %w[staging production].include?(@_config.deploy_type)
22
25
 
@@ -108,7 +111,7 @@ module Qops::DeployHelpers
108
111
  return 'master' unless config.deploy_type == 'staging'
109
112
  if options[:branch].present?
110
113
  options[:branch]
111
- elsif `git --version` # rubocop:disable Lint/LiteralInCondition
114
+ elsif `git --version` # rubocop:disable Lint/LiteralAsCondition
112
115
  `git symbolic-ref --short HEAD`.strip
113
116
  else
114
117
  'master'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
2
4
  include Qops::DeployHelpers
3
5
 
@@ -55,9 +57,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
55
57
 
56
58
  # Start the instance if necessary
57
59
  print 'Booting instance ...'
58
- unless %w[online booting].include?(instance.status)
59
- config.opsworks.start_instance(instance_id: instance_id)
60
- end
60
+ config.opsworks.start_instance(instance_id: instance_id) unless %w[online booting].include?(instance.status)
61
61
 
62
62
  manifest = {
63
63
  environment: config.deploy_type,
@@ -144,9 +144,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
144
144
  def clean
145
145
  initialize_run
146
146
 
147
- if config.deploy_type == 'production'
148
- fail "Cannot clean instances in a #{config.deploy_type} environment"
149
- end
147
+ fail "Cannot clean instances in a #{config.deploy_type} environment" if config.deploy_type == 'production'
150
148
 
151
149
  terminated_instances = []
152
150
 
@@ -297,9 +295,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
297
295
 
298
296
  def terminate_instance(instance_id)
299
297
  # Remove schedule if time based instance
300
- if config.autoscale_type == 'timer'
301
- config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {})
302
- end
298
+ config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {}) if config.autoscale_type == 'timer'
303
299
 
304
300
  # Get the instance from the id
305
301
  instance = retrieve_instance(instance_id)
@@ -314,9 +310,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
314
310
 
315
311
  # Attempt to shutdown the instance
316
312
  print "Attempting instance #{instance_id} - #{instance.hostname} shutdown ..."
317
- unless instance.status == 'stopped'
318
- config.opsworks.stop_instance(instance_id: instance_id)
319
- end
313
+ config.opsworks.stop_instance(instance_id: instance_id) unless instance.status == 'stopped'
320
314
 
321
315
  manifest = {
322
316
  environment: config.deploy_type,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Stack < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'quandl/config'
2
4
 
3
5
  module Qops
@@ -26,17 +28,36 @@ module Qops
26
28
  puts Rainbow(message).bg(:black).red
27
29
  when :warning
28
30
  puts Rainbow(message).bg(:black).yellow
31
+ when :good
32
+ puts Rainbow(message).bg(:black).green
29
33
  else
30
34
  puts message
31
35
  end
32
36
  end
33
37
 
34
- def initialize(profile: nil, force_config: false)
38
+ def initialize(profile: nil, force_config: false, verbose: false)
35
39
  @_aws_config = { region: configuration.region }
36
40
  @_aws_config[:profile] = profile unless profile.nil?
41
+
37
42
  @_force_config = force_config
38
- profile.nil? ? opsworks.config.credentials.credentials : @_aws_config[:profile] = profile
39
- puts Rainbow("using aws profile #{profile}").bg(:black).green unless profile.nil?
43
+ @_verbose = verbose
44
+
45
+ if profile.nil?
46
+ opsworks.config.credentials.credentials
47
+ else
48
+ parsed_creds = Aws.shared_config.instance_variable_get('@parsed_credentials')[profile]
49
+ role_credentials = Aws::AssumeRoleCredentials.new(
50
+ role_arn: parsed_creds['role_arn'],
51
+ role_session_name: profile
52
+ )
53
+ # Aws::OpsWorks::Client.new(credentials: role_credentials).describe_stacks.stacks.each { |s| puts s }
54
+ @_aws_config[:credentials] = role_credentials
55
+
56
+ puts Rainbow("Using AWS profile #{profile}").bg(:black).green
57
+ end
58
+
59
+ Aws.config.update(@_aws_config)
60
+
40
61
  puts Rainbow('Forcing Qops to read the opsworks parameter strictly from yaml') if force_config
41
62
  %w[deploy_type region app_name].each do |v|
42
63
  fail "Please configure #{v} before continuing." unless option?(v)
@@ -55,12 +76,12 @@ module Qops
55
76
  end
56
77
 
57
78
  def stack_id(options = {})
58
- return configuration.stack_id if @_force_config
79
+ return configuration.stack_id if force_config?
59
80
  stack(options).stack_id
60
81
  end
61
82
 
62
83
  def subnet(options = {})
63
- return configuration.subnet if @_force_config
84
+ return configuration.subnet if force_config?
64
85
  stack(options).default_subnet_id
65
86
  end
66
87
 
@@ -69,9 +90,9 @@ module Qops
69
90
  end
70
91
 
71
92
  def layer_id(_options = {})
72
- return configuration.layer_id if @_force_config
93
+ return configuration.layer_id if force_config?
73
94
  name = configuration.layer_name
74
- puts "searching for #{name}"
95
+ verbose_output("Searching for layer : #{name}")
75
96
  layer = layers.find { |l| l.name.match(/#{name}/i) }
76
97
  layer.layer_id
77
98
  end
@@ -85,7 +106,7 @@ module Qops
85
106
  end
86
107
 
87
108
  def application_id(options = {})
88
- return configuration.application_id if @_force_config
109
+ return configuration.application_id if force_config?
89
110
  apps(options).first.app_id
90
111
  end
91
112
 
@@ -136,13 +157,25 @@ module Qops
136
157
  end
137
158
 
138
159
  def elb
139
- @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(region: 'us-east-1', profile: @_aws_config[:profile])
160
+ @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(**@_aws_config)
140
161
  end
141
162
 
142
163
  def cookbook_json
143
164
  configuration.cookbook_json || 'custom.json'
144
165
  end
145
166
 
167
+ def verbose?
168
+ @_verbose
169
+ end
170
+
171
+ def verbose_output(text)
172
+ self.class.print_with_colour(text, :warning) if verbose?
173
+ end
174
+
175
+ def force_config?
176
+ @_force_config
177
+ end
178
+
146
179
  def option?(key)
147
180
  respond_to?(key.to_sym) || configuration.instance_variable_get(:@table).keys.include?(key.to_sym)
148
181
  end
@@ -172,18 +205,24 @@ module Qops
172
205
  :stack_id
173
206
  else
174
207
  id = identity_from_config
175
- msg = Rainbow("Using opsworks.yml config #{id}: #{configuration.send(id)}")
176
- puts(msg.bg(:black).green)
208
+ self.class.print_with_colour("Using opsworks.yml config #{id}: #{configuration.send(id)}", :good)
177
209
  id
178
210
  end
179
211
  end
180
212
 
181
213
  def search_stack(key, value)
182
- stack = opsworks.describe_stacks.stacks.find { |s| s.send(key) == value }
214
+ verbose_output("Searching for stack : #{value}")
215
+
216
+ stack = opsworks.describe_stacks.stacks.find do |s|
217
+ verbose_output("Found stack: #{s.send(key)}")
218
+ s.send(key) == value
219
+ end
220
+
183
221
  unless stack
184
- puts Rainbow("Could not find stack with #{key} = #{value}").bg(:black).red
222
+ self.class.print_with_colour("Could not find stack with #{key} = #{value}", :error)
185
223
  exit(-1)
186
224
  end
225
+
187
226
  stack
188
227
  end
189
228
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::Helpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qops
4
- VERSION = '1.6.1'.freeze
4
+ VERSION = '1.7.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Basset
@@ -12,22 +12,22 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-10-20 00:00:00.000000000 Z
15
+ date: 2018-01-25 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
- name: qthor
18
+ name: activesupport
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.19.1.4
23
+ version: 4.2.1
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
28
  - - ">="
29
29
  - !ruby/object:Gem::Version
30
- version: 0.19.1.4
30
+ version: 4.2.1
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: aws-sdk
33
33
  requirement: !ruby/object:Gem::Requirement
@@ -71,33 +71,33 @@ dependencies:
71
71
  - !ruby/object:Gem::Version
72
72
  version: '0'
73
73
  - !ruby/object:Gem::Dependency
74
- name: activesupport
74
+ name: rainbow
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
- - - ">="
77
+ - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: 4.2.1
79
+ version: 2.0.0
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - ">="
84
+ - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: 4.2.1
86
+ version: 2.0.0
87
87
  - !ruby/object:Gem::Dependency
88
- name: rainbow
88
+ name: thor
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - "~>"
91
+ - - ">="
92
92
  - !ruby/object:Gem::Version
93
- version: 2.0.0
93
+ version: 0.20.0
94
94
  type: :runtime
95
95
  prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
- - - "~>"
98
+ - - ">="
99
99
  - !ruby/object:Gem::Version
100
- version: 2.0.0
100
+ version: 0.20.0
101
101
  description: Help to automate opsworks project deployments with single commands.
102
102
  email:
103
103
  - support@quandl.com
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
137
  version: '0'
138
138
  requirements: []
139
139
  rubyforge_project:
140
- rubygems_version: 2.6.12
140
+ rubygems_version: 2.7.4
141
141
  signing_key:
142
142
  specification_version: 4
143
143
  summary: Helper commands for deployment of opsworks projects.