skyed 0.1.16 → 0.2.0.dev

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
2
  SHA1:
3
- metadata.gz: 3c7e876e257b3c2f1182efee7c025f2539be64de
4
- data.tar.gz: 3eaecf6f9e665ce0707253169aca08068b5d8909
3
+ metadata.gz: 3124fdc3cf9df40d2a03eeffa5917fe023bb89e2
4
+ data.tar.gz: 8247811351a59cb45f821dbedc10e11c52905db2
5
5
  SHA512:
6
- metadata.gz: 427b7cda600871b0281eba8e6ac2431b447ea246f99a1f426719818577ccf6965760aa7c3485c15b4e8a2c976a5f103404963eca1d92692f49234680f43da4b3
7
- data.tar.gz: 8508f75ef06f91e4c4a8e164510f0ad3de34af65444ed3be7b0f626a525da1712b9549936f148197a5b54a17dbd7bceff4b74df1f55a907a14676290e50e4624
6
+ metadata.gz: 1484ec18626a64f4c96eb8eec6dad307f1c2eea966b468aef58b7566759ec0ac47237c6986ffd0c3bb0521d4ecc527b69f1e6f8333d001349c8b24d2a846f180
7
+ data.tar.gz: 22c9d5d85ea8bbc0ef6863ce21ad08d3a9f3b81bab872a002221b2788013ea846b9ab0b3b6e94abbc42022f27f69c22093f9557af320646de578fba02569b5c4
data/bin/skyed CHANGED
@@ -1,17 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+
2
3
  project_path = File.dirname(File.dirname(__FILE__))
3
4
  $LOAD_PATH.unshift project_path + '/lib'
5
+ $LOAD_PATH.unshift project_path + '/plugins'
4
6
 
5
- require 'gli'
6
- require 'skyed'
7
-
8
- include GLI::App
9
-
10
- program_desc 'Are you surrounded by sky?'
11
- Skyed::Settings.load!
12
-
13
- switch [:q, :quiet]
14
-
15
- require 'skyed/commands'
7
+ require 'skyed/cli'
16
8
 
17
- exit run(ARGV)
9
+ Skyed::CLI.start(ARGV)
@@ -1,17 +1,8 @@
1
- require 'skyed/list'
2
- require 'skyed/create'
3
- require 'skyed/check'
4
- require 'skyed/utils'
5
- require 'skyed/git'
6
- require 'skyed/aws'
7
- require 'skyed/destroy'
8
- require 'skyed/stop'
9
- require 'skyed/run'
10
- require 'skyed/deploy'
11
- require 'skyed/init'
1
+ require 'require_all'
12
2
  require 'skyed/settings'
3
+ require_all 'plugins/*/lib/**/*.rb'
13
4
 
14
- # Skyed is a set of tools for cloud computing
5
+ # Main Skyed module
15
6
  module Skyed
16
- VERSION = '0.1.16'
7
+ VERSION = '0.2.0.dev'
17
8
  end
@@ -0,0 +1,10 @@
1
+ require 'thor'
2
+ require 'skyed'
3
+
4
+ module Skyed
5
+ # Main CLI for Skyed
6
+ class CLI < Thor
7
+ desc 'settings', 'Manage Skyed settings'
8
+ subcommand 'settings', Skyed::Settings
9
+ end
10
+ end
@@ -1,47 +1,11 @@
1
- module Skyed
2
- # This module encapsulates settings for Skyed
3
- module Settings
4
- CONFIG_FILE = "#{ENV['HOME']}/.skyed"
5
- @_settings = {}
6
- attr_accessor :_settings
7
-
8
- class << self
9
- def current_stack?(stack_id)
10
- !Skyed::Settings.empty? && Skyed::Settings.stack_id == stack_id
11
- end
12
-
13
- def load!(filename = CONFIG_FILE)
14
- newsets = {}
15
- newsets = YAML.load_file(filename) if File.file? filename
16
- deep_merge!(@_settings, newsets)
17
- end
18
-
19
- def empty?
20
- @_settings.empty?
21
- end
1
+ require 'thor'
22
2
 
23
- def deep_merge!(target, data)
24
- merger = proc do |_, v1, v2|
25
- v1.is_a?(Hash) && v2.is_a?(Hash) ? v1.merge(v2, &merger) : v2
26
- end
27
- target.merge! data, &merger
28
- end
29
-
30
- def method_missing(name, *args)
31
- msg = "unknown configuration root #{name}."
32
- msg += ' Initialize skyed or export PKEY'
33
- if name.match(/.*=/)
34
- @_settings[name.to_s.split('=')[0]] = args[0]
35
- else
36
- @_settings[name.to_s] ||
37
- fail(
38
- NoMethodError, msg, caller)
39
- end
40
- end
41
-
42
- def save(filename = CONFIG_FILE)
43
- File.open(filename, 'w') { |f| YAML.dump @_settings, f }
44
- end
3
+ module Skyed
4
+ # Settings CLI for Skyed
5
+ class Settings < Thor
6
+ desc 'list', 'List Skyed settings'
7
+ def list
8
+ fail NotImplementedError, 'settings list is not yet implemented'
45
9
  end
46
10
  end
47
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skyed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.2.0.dev
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignasi Fosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-05 00:00:00.000000000 Z
11
+ date: 2016-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -28,44 +28,30 @@ dependencies:
28
28
  name: aws-sdk
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.33
33
+ version: 2.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.33
40
+ version: 2.0.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: gli
42
+ name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 2.12.2
47
+ version: 0.19.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 2.12.2
55
- - !ruby/object:Gem::Dependency
56
- name: highline
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 1.6.21
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 1.6.21
54
+ version: 0.19.1
69
55
  description: A cloudy gem
70
56
  email: natx@y10k.ws
71
57
  executables:
@@ -75,19 +61,8 @@ extra_rdoc_files: []
75
61
  files:
76
62
  - bin/skyed
77
63
  - lib/skyed.rb
78
- - lib/skyed/aws.rb
79
- - lib/skyed/check.rb
80
- - lib/skyed/commands.rb
81
- - lib/skyed/create.rb
82
- - lib/skyed/deploy.rb
83
- - lib/skyed/destroy.rb
84
- - lib/skyed/git.rb
85
- - lib/skyed/init.rb
86
- - lib/skyed/list.rb
87
- - lib/skyed/run.rb
64
+ - lib/skyed/cli.rb
88
65
  - lib/skyed/settings.rb
89
- - lib/skyed/stop.rb
90
- - lib/skyed/utils.rb
91
66
  - templates/Vagrantfile.erb
92
67
  - templates/config.j2.erb
93
68
  - templates/credentials.j2.erb
@@ -108,9 +83,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
83
  version: '0'
109
84
  required_rubygems_version: !ruby/object:Gem::Requirement
110
85
  requirements:
111
- - - ">="
86
+ - - ">"
112
87
  - !ruby/object:Gem::Version
113
- version: '0'
88
+ version: 1.3.1
114
89
  requirements: []
115
90
  rubyforge_project:
116
91
  rubygems_version: 2.4.8
@@ -1,549 +0,0 @@
1
- require 'aws-sdk'
2
- require 'highline/import'
3
-
4
- ACCESS_QUESTION = 'What is your AWS Access Key? '
5
- SECRET_QUESTION = 'What is your AWS Secret Key? '
6
-
7
- module Skyed
8
- # This module encapsulates all the AWS related functions.
9
- module AWS
10
- class << self
11
- def region
12
- ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
13
- end
14
-
15
- def set_credentials(access, secret, skip_question = true)
16
- access = ask(ACCESS_QUESTION) unless Skyed::AWS.valid_credential?(
17
- 'AWS_ACCESS_KEY') && skip_question
18
- secret = ask(SECRET_QUESTION) unless Skyed::AWS.valid_credential?(
19
- 'AWS_SECRET_KEY') && skip_question
20
- if Skyed::AWS.confirm_credentials?(access, secret)
21
- Skyed::Settings.access_key = access
22
- Skyed::Settings.secret_key = secret
23
- else
24
- set_credentials(access, secret, false)
25
- end
26
- end
27
-
28
- def valid_credential?(env_var_name)
29
- ENV[env_var_name] != '' && !ENV[env_var_name].nil?
30
- end
31
-
32
- def confirm_credentials?(access, secret)
33
- client = Skyed::AWS::IAM.login(access, secret)
34
- client.get_account_summary
35
- true
36
- rescue Aws::IAM::Errors::InvalidClientTokenId
37
- false
38
- end
39
- end
40
-
41
- # This module encapsulates all the RDS related functions.
42
- module ELB
43
- class << self
44
- def instance_ok?(elb_name, ec2_instance_id, elb = nil)
45
- elb.describe_instance_health(
46
- load_balancer_name: elb_name,
47
- instances: [{ instance_id: ec2_instance_id }]
48
- ).instance_states[0].state == 'InService'
49
- end
50
-
51
- def set_health_check(elb_name, health_check, elb = nil)
52
- elb.configure_health_check(
53
- load_balancer_name: elb_name,
54
- health_check: {
55
- target: health_check.target,
56
- interval: health_check.interval,
57
- timeout: health_check.timeout,
58
- unhealthy_threshold: health_check.unhealthy_threshold,
59
- healthy_threshold: health_check.healthy_threshold
60
- }
61
- )
62
- end
63
-
64
- def get_health_check(elb_name, elb = nil)
65
- elbs = elb.describe_load_balancers(load_balancer_names: [elb_name])
66
- elbs.load_balancer_descriptions[0].health_check
67
- end
68
-
69
- def login(
70
- access = Skyed::Settings.access_key,
71
- secret = Skyed::Settings.secret_key,
72
- region = Skyed::AWS.region)
73
- Aws::ElasticLoadBalancing::Client.new(
74
- access_key_id: access,
75
- secret_access_key: secret,
76
- region: region)
77
- end
78
- end
79
- end
80
-
81
- # This module encapsulates all the RDS related functions.
82
- module RDS
83
- class << self
84
- def create_instance_from_snapshot(
85
- instance_name, snapshot, options, rds = nil)
86
- rds = login if rds.nil?
87
- rds.restore_db_instance_from_db_snapshot(
88
- db_instance_identifier: instance_name,
89
- db_snapshot_identifier: snapshot)[:db_instance]
90
- db_instance = wait_for_instance(
91
- instance_name, 'available', options[:wait_interval], rds)
92
- "#{db_instance[:endpoint][:address]}:#{db_instance[:endpoint][:port]}"
93
- end
94
-
95
- def list_snapshots(_options, args, rds = nil)
96
- rds = login if rds.nil?
97
- request = {}
98
- request[:db_instance_identifier] = args.first unless args.nil?
99
- response = rds.describe_db_snapshots(request)
100
- response.db_snapshots
101
- end
102
-
103
- def destroy_instance(instance_name, options, rds = nil)
104
- rds = login if rds.nil?
105
- rds.delete_db_instance(
106
- generate_params(instance_name, options))[:db_instance]
107
- end
108
-
109
- def generate_delete_params(instance_name, options)
110
- snapshot = !options[:final_snapshot_name].empty?
111
- params = {
112
- db_instance_identifier: instance_name,
113
- skip_final_snapshot: !snapshot
114
- }
115
- snapshot_name = options[:final_snapshot_name]
116
- params[:final_db_snapshot_identifier] = snapshot_name if snapshot
117
- params
118
- end
119
-
120
- def generate_create_params(instance_name, options)
121
- {
122
- db_instance_identifier: instance_name,
123
- allocated_storage: options[:size],
124
- db_instance_class: "db.#{options[:type]}",
125
- engine: 'postgres',
126
- master_username: options[:user],
127
- master_user_password: options[:password],
128
- db_security_groups: [options[:db_security_group]],
129
- db_parameter_group_name: options[:db_parameters_group]
130
- }
131
- end
132
-
133
- def wait_for_instance(instance_name, status, wait = 0, rds = nil)
134
- rds = login if rds.nil?
135
- instance = rds.describe_db_instances(
136
- db_instance_identifier: instance_name)[:db_instances][0]
137
- while instance[:db_instance_status] != status
138
- sleep(wait)
139
- instance = rds.describe_db_instances(
140
- db_instance_identifier: instance_name)[:db_instances][0]
141
- end
142
- instance
143
- end
144
-
145
- def generate_params(instance_name, options)
146
- params = generate_delete_params(
147
- instance_name, options) if options.key? :final_snapshot_name
148
- params = generate_create_params(
149
- instance_name, options) if options.key? :user
150
- params
151
- end
152
-
153
- def create_instance(instance_name, options, rds = nil)
154
- rds = login if rds.nil?
155
- rds.create_db_instance(
156
- generate_params(instance_name, options))[:db_instance]
157
- db_instance = wait_for_instance(instance_name, 'available', 0, rds)
158
- "#{db_instance[:endpoint][:address]}:#{db_instance[:endpoint][:port]}"
159
- end
160
-
161
- def login(
162
- access = Skyed::Settings.access_key,
163
- secret = Skyed::Settings.secret_key,
164
- region = Skyed::AWS.region)
165
- Aws::RDS::Client.new(
166
- access_key_id: access,
167
- secret_access_key: secret,
168
- region: region)
169
- end
170
- end
171
- end
172
-
173
- # This module encapsulates all the OpsWorks related functions.
174
- module OpsWorks
175
- STACK = {
176
- name: '',
177
- region: '',
178
- service_role_arn: '',
179
- default_instance_profile_arn: '',
180
- default_os: 'Ubuntu 12.04 LTS',
181
- default_ssh_key_name: '',
182
- custom_cookbooks_source: {
183
- type: 'git'
184
- },
185
- configuration_manager: {
186
- name: 'Chef',
187
- version: '11.10'
188
- },
189
- use_custom_cookbooks: true,
190
- use_opsworks_security_groups: false
191
- }
192
- LAYER = {
193
- stack_id: nil,
194
- type: 'custom',
195
- name: '',
196
- shortname: '',
197
- custom_security_group_ids: []
198
- }
199
-
200
- class << self
201
- def instance_by_id(instance_id, opsworks)
202
- instances_data = opsworks.describe_instances(
203
- instance_ids: [instance_id])
204
- instances = instances_data[:instances] unless instances_data.nil?
205
- instances[0] unless instances.nil?
206
- end
207
-
208
- def start_instance(instance_id, opsworks)
209
- opsworks.start_instance(instance_id: instance_id)
210
- wait_for_instance_id(instance_id, 'online', opsworks)
211
- puts instance_by_id(instance_id, opsworks).public_dns
212
- end
213
-
214
- def instances_by_status(stack_id, layer_id, status, ow)
215
- Skyed::Settings.stack_id = stack(stack_id, ow).stack_id
216
- ow.describe_instances(
217
- layer_id: layer(layer_id, ow).layer_id)[:instances].select do |i|
218
- i.status == status
219
- end
220
- end
221
-
222
- def stop_instance(stack_id, hostname, opsworks = nil)
223
- opsworks = login if opsworks.nil?
224
- instance = instance_by_name(hostname, stack_id, opsworks)
225
- opsworks.stop_instance(instance_id: instance.instance_id)
226
- wait_for_instance_id(
227
- instance.instance_id,
228
- 'stopped',
229
- opsworks)
230
- end
231
-
232
- def create_instance(stack_id, layer_id, instance_type, opsworks)
233
- instance = opsworks.create_instance(
234
- stack_id: stack_id,
235
- layer_ids: [layer_id],
236
- instance_type: instance_type)
237
- opsworks.start_instance(instance_id: instance.instance_id)
238
- wait_for_instance_id(
239
- instance.instance_id,
240
- 'online',
241
- opsworks)
242
- end
243
-
244
- def wait_for_instance_id(instance_id, status, opsworks)
245
- instance = opsworks.describe_instances(
246
- instance_ids: [instance_id]).instances.first
247
- until instance.nil? || instance.status == status
248
- sleep(0)
249
- instance = opsworks.describe_instances(
250
- instance_ids: [instance_id]).instances.first
251
- end
252
- end
253
-
254
- def deregister_instance(hostname, opsworks)
255
- instance = instance_by_name(
256
- hostname, Skyed::Settings.stack_id, opsworks)
257
- opsworks.deregister_instance(
258
- instance_id: instance.instance_id) unless instance.nil?
259
- wait_for_instance(
260
- hostname, Skyed::Settings.stack_id, 'terminated', opsworks)
261
- end
262
-
263
- def delete_user(opsworks)
264
- stack = opsworks.describe_stacks(
265
- stack_ids: [Skyed::Settings.stack_id])[:stacks][0][:name]
266
- layer = opsworks.describe_layers(
267
- layer_ids: [Skyed::Settings.layer_id])[:layers][0][:name]
268
- Skyed::AWS::IAM.delete_user "OpsWorks-#{stack}-#{layer}"
269
- end
270
-
271
- def wait_for_instance(instance_name, stack_id, status, opsworks)
272
- instance = Skyed::AWS::OpsWorks.instance_by_name(
273
- instance_name, stack_id, opsworks)
274
- until instance.nil? || instance.status == status
275
- sleep(0)
276
- instance = Skyed::AWS::OpsWorks.instance_by_name(
277
- instance_name, stack_id, opsworks)
278
- end
279
- end
280
-
281
- def stack(stack_criteria, opsworks)
282
- stack_by_name(
283
- stack_criteria,
284
- opsworks
285
- ) || stack_by_id(stack_criteria, opsworks)
286
- end
287
-
288
- def layer(layer_criteria, opsworks, stack_id = nil)
289
- layer = layer_by_name(layer_criteria, opsworks) ||
290
- layer_by_id(layer_criteria, opsworks)
291
- instance = nil
292
- instance = instance_by_name(
293
- layer_criteria, stack_id, opsworks) unless stack_id.nil?
294
- layer ||= layer_by_id(
295
- instance.layer_ids[0], opsworks) unless instance.nil?
296
- layer
297
- end
298
-
299
- def deploy(opts)
300
- xtra = { instance_ids: opts[:instance_ids] }
301
- xtra[:custom_json] = opts[:custom_json] if opts.key? :custom_json
302
- Skyed::AWS::OpsWorks.wait_for_deploy(
303
- opts[:client].create_deployment(
304
- Skyed::AWS::OpsWorks.generate_deploy_params(
305
- opts[:stack_id],
306
- opts[:command],
307
- xtra)),
308
- opts[:client],
309
- opts[:wait_interval])
310
- end
311
-
312
- def layer_by_id(layer_id, opsworks)
313
- layers(opsworks).select { |x| x[:layer_id] == layer_id }[0] || nil
314
- end
315
-
316
- def layer_by_name(layer_name, opsworks)
317
- layers(opsworks).select { |x| x[:name] == layer_name }[0] || nil
318
- end
319
-
320
- def layers(opsworks)
321
- opsworks.describe_layers(stack_id: Skyed::Settings.stack_id)[:layers]
322
- end
323
-
324
- def stack_by_id(stack_id, opsworks)
325
- stacks(opsworks).select { |x| x[:stack_id] == stack_id }[0] || nil
326
- end
327
-
328
- def running_instances(options = {}, opsworks)
329
- instances = opsworks.describe_instances(options)
330
- instances[:instances].map do |instance|
331
- instance[:instance_id] if instance[:status] != 'stopped'
332
- end.compact
333
- end
334
-
335
- def instance_by_name(hostname, stack_id, opsworks)
336
- opsworks.describe_instances(
337
- stack_id: stack_id)[:instances].select do |i|
338
- i.hostname == hostname
339
- end[0]
340
- end
341
-
342
- def wait_for_deploy(deploy, opsworks, wait = 0)
343
- status = Skyed::AWS::OpsWorks.deploy_status(deploy, opsworks)
344
- while status[0] == 'running'
345
- sleep(wait)
346
- status = Skyed::AWS::OpsWorks.deploy_status(deploy, opsworks)
347
- end
348
- status
349
- end
350
-
351
- def deploy_status(deploy, opsworks)
352
- deploy = opsworks.describe_deployments(
353
- deployment_ids: [deploy[:deployment_id]])
354
- deploy[:deployments].map do |s|
355
- s[:status]
356
- end.compact
357
- end
358
-
359
- def generate_deploy_params(stack_id, command, options = {})
360
- options = {} if options.nil?
361
- params = {
362
- stack_id: stack_id,
363
- command: generate_command_params(command)
364
- }
365
- params.merge(options)
366
- end
367
-
368
- def generate_command_params(options = {})
369
- response = options
370
- response = {
371
- name: options[:name],
372
- args: options.reject { |k, _v| k == :name }
373
- } unless options[:name] != 'execute_recipes'
374
- response
375
- end
376
-
377
- def create_layer(layer_params, opsworks)
378
- layer = opsworks.create_layer(layer_params)
379
- Skyed::Settings.layer_id = layer.data[:layer_id]
380
- end
381
-
382
- def create_stack(stack_params, opsworks)
383
- stack = opsworks.create_stack(stack_params)
384
- Skyed::Settings.stack_id = stack.data[:stack_id]
385
- end
386
-
387
- def delete_stack(stack_name, opsworks)
388
- total = count_instances(stack_name, opsworks)
389
- error_msg = "Stack with name #{stack_name}"
390
- error_msg += ' exists and contains instances'
391
- fail error_msg unless total == 0
392
- stack = stack_by_name(stack_name, opsworks)
393
- opsworks.delete_stack(stack_id: stack[:stack_id])
394
- end
395
-
396
- def count_instances(stack_name, opsworks)
397
- stack_summary = stack_summary_by_name(stack_name, opsworks)
398
- return nil if stack_summary.nil?
399
- total = stack_summary[:instances_count].values.compact.inject(:+) || 0
400
- total
401
- end
402
-
403
- def stack_summary_by_name(stack_name, opsworks)
404
- stack = stack_by_name(stack_name, opsworks)
405
- opsworks.describe_stack_summary(
406
- stack_id: stack[:stack_id])[:stack_summary] unless stack.nil?
407
- end
408
-
409
- def stack_by_name(stack_name, opsworks)
410
- stacks(opsworks).select { |x| x[:name] == stack_name }[0] || nil
411
- end
412
-
413
- def stacks(opsworks)
414
- opsworks.describe_stacks[:stacks]
415
- end
416
-
417
- def basic_stack_params
418
- params = STACK
419
- params[:name] = ENV['USER']
420
- params[:region] = Skyed::AWS.region
421
- params[:service_role_arn] = Skyed::Settings.role_arn
422
- params[:default_instance_profile_arn] = Skyed::Settings.profile_arn
423
- params[:default_ssh_key_name] = Skyed::Settings.aws_key_name
424
- params
425
- end
426
-
427
- def custom_cookbooks_source(base_source)
428
- base_source[:url] = Skyed::Settings.remote_url
429
- base_source[:revision] = Skyed::Settings.branch
430
- base_source[:ssh_key] = Skyed::Utils.read_key_file(
431
- Skyed::Settings.opsworks_git_key)
432
- base_source
433
- end
434
-
435
- def configuration_manager(base_config, options)
436
- base_config[:name] = 'Chef'
437
- base_config[:version] = options[:chef_version] || '11.10'
438
- base_config
439
- end
440
-
441
- def generate_params(stack_id = nil, options = {})
442
- params = generate_layer_params(stack_id) unless stack_id.nil?
443
- params = generate_stack_params(options) if stack_id.nil?
444
- params
445
- end
446
-
447
- def generate_layer_params(stack_id)
448
- params = LAYER
449
- params[:stack_id] = stack_id
450
- params[:name] = "test-#{ENV['USER']}"
451
- params[:shortname] = "test-#{ENV['USER']}"
452
- params[:custom_security_group_ids] = ['sg-f1cc2498']
453
- params
454
- end
455
-
456
- def generate_stack_params(options)
457
- params = basic_stack_params
458
- params[:custom_json] = options[:custom_json] || ''
459
- params[:custom_cookbooks_source] = custom_cookbooks_source(
460
- STACK[:custom_cookbooks_source])
461
- params[:configuration_manager] = configuration_manager(
462
- STACK[:configuration_manager], options)
463
- params
464
- end
465
-
466
- def login(
467
- access = Skyed::Settings.access_key,
468
- secret = Skyed::Settings.secret_key,
469
- region = Skyed::AWS.region)
470
- Aws::OpsWorks::Client.new(
471
- access_key_id: access,
472
- secret_access_key: secret,
473
- region: region)
474
- end
475
-
476
- def set_arns(service_role = nil, instance_profile = nil)
477
- iam = Skyed::AWS::IAM.login
478
- Skyed::Settings.role_arn = service_role || iam.get_role(
479
- role_name: 'aws-opsworks-service-role')[:role][:arn]
480
- Skyed::Settings.profile_arn = instance_profile || iam
481
- .get_instance_profile(
482
- instance_profile_name: 'aws-opsworks-ec2-role'
483
- )[:instance_profile][:arn]
484
- end
485
- end
486
- end
487
-
488
- # This module encapsulates all the IAM related functions.
489
- module IAM
490
- class << self
491
- def remove_user_from_group(user, group)
492
- iam = login
493
- puts "Removes #{user} from #{group}"
494
- iam.remove_user_from_group(
495
- group_name: group,
496
- user_name: user)
497
- rescue Aws::IAM::Errors::NoSuchEntity
498
- puts "User #{user} already removed from group #{group}"
499
- end
500
-
501
- def clear_user_access_keys(user)
502
- iam = login
503
- iam.list_access_keys(
504
- user_name: user)[:access_key_metadata].each do |access_key|
505
- id = access_key.to_h[:access_key_id]
506
- puts "Delete access key #{id}"
507
- iam.delete_access_key(user_name: user, access_key_id: id)
508
- end
509
- rescue Aws::IAM::Errors::NoSuchEntity
510
- puts "User #{user} access keys already removed"
511
- end
512
-
513
- def clear_user_policies(user)
514
- iam = login
515
- iam.list_user_policies(
516
- user_name: user)[:policy_names].each do |policy|
517
- puts "Delete user policy #{policy}"
518
- iam.delete_user_policy(user_name: user, policy_name: policy)
519
- end
520
- rescue Aws::IAM::Errors::NoSuchEntity
521
- puts "User #{user} policies already removed"
522
- end
523
-
524
- def delete_user(user)
525
- iam = login
526
- clear_user_policies user
527
- clear_user_access_keys user
528
- remove_user_from_group user, "OpsWorks-#{Skyed::Settings.stack_id}"
529
- puts "Delete group OpsWorks-#{Skyed::Settings.stack_id}"
530
- iam.delete_group(group_name: "OpsWorks-#{Skyed::Settings.stack_id}")
531
- puts "Delete User #{user}"
532
- iam.delete_user(user_name: user)
533
- rescue Aws::IAM::Errors::NoSuchEntity
534
- puts "User #{user} already removed"
535
- end
536
-
537
- def login(
538
- access = Skyed::Settings.access_key,
539
- secret = Skyed::Settings.secret_key,
540
- region = Skyed::AWS.region)
541
- Aws::IAM::Client.new(
542
- access_key_id: access,
543
- secret_access_key: secret,
544
- region: region)
545
- end
546
- end
547
- end
548
- end
549
- end