skyed 0.1.6 → 0.1.7

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: a4919c799f528c92156839651694c2daea7d0ad2
4
- data.tar.gz: d327289353ebc57d40bb4c52e258ae1491471c1d
3
+ metadata.gz: b3dff20f796f444c5110db4e24ab5fbe30640f2a
4
+ data.tar.gz: 4c90c8a4b5d6f667ee8f4d21e3734c1dd9a09146
5
5
  SHA512:
6
- metadata.gz: 5dafeb6a8f80a254dac4a235093dba68771fbc9d4b7373359231bba304815cdb2e456e4842bb7254cf9c3fe48998b7f450d78e7ee0bb29a47932368e2897c8a5
7
- data.tar.gz: 8055ad8d312c27a1e06379ef45dc7d76c607642e4e5b848f9aa4116d5995d07e6ce9fdaffd860af48898439a6b655964bb0f374f62474301eec744156778cc74
6
+ metadata.gz: b7c950fbf09f8d159da451fcb1cb89c5775de866b224d18396373724f480db5028054cff8a9bc6cf49079fbffbaa91b2e168c2f78efcd63d905da893551ff739
7
+ data.tar.gz: dd78e8e85aacf0f4ea3aea195d8450759a245503b14268caffa25a53dbe5204f7b723ea1bc60393ccde03abd0274e4ec235724d6443aef47f28433c2adabe8fc
data/lib/skyed/aws.rb CHANGED
@@ -66,6 +66,98 @@ module Skyed
66
66
  }
67
67
 
68
68
  class << self
69
+ def stack(stack_criteria, opsworks)
70
+ stack_by_name(
71
+ stack_criteria,
72
+ opsworks
73
+ ) || stack_by_id(stack_criteria, opsworks)
74
+ end
75
+
76
+ def layer(layer_criteria, opsworks)
77
+ layer_by_name(
78
+ layer_criteria,
79
+ opsworks
80
+ ) || layer_by_id(layer_criteria, opsworks)
81
+ end
82
+
83
+ def deploy(opts)
84
+ xtra = { instance_ids: opts[:instance_ids] }
85
+ xtra[:custom_json] = opts[:custom_json] if opts.key? :custom_json
86
+ Skyed::AWS::OpsWorks.wait_for_deploy(
87
+ opts[:client].create_deployment(
88
+ Skyed::AWS::OpsWorks.generate_deploy_params(
89
+ opts[:stack_id],
90
+ opts[:command],
91
+ xtra)),
92
+ opts[:client],
93
+ opts[:wait_interval])
94
+ end
95
+
96
+ def layer_by_id(layer_id, opsworks)
97
+ layers(opsworks).select { |x| x[:layer_id] == layer_id }[0] || nil
98
+ end
99
+
100
+ def layer_by_name(layer_name, opsworks)
101
+ layers(opsworks).select { |x| x[:name] == layer_name }[0] || nil
102
+ end
103
+
104
+ def layers(opsworks)
105
+ opsworks.describe_layers(stack_id: Skyed::Settings.stack_id)[:layers]
106
+ end
107
+
108
+ def stack_by_id(stack_id, opsworks)
109
+ stacks(opsworks).select { |x| x[:stack_id] == stack_id }[0] || nil
110
+ end
111
+
112
+ def running_instances(options = {}, opsworks)
113
+ instances = opsworks.describe_instances(options)
114
+ instances[:instances].map do |instance|
115
+ instance[:instance_id] if instance[:status] != 'stopped'
116
+ end.compact
117
+ end
118
+
119
+ def instance_by_name(hostname, stack_id, opsworks)
120
+ opsworks.describe_instances(
121
+ stack_id: stack_id)[:instances].select do |i|
122
+ i.hostname == hostname
123
+ end[0]
124
+ end
125
+
126
+ def wait_for_deploy(deploy, opsworks, wait = 0)
127
+ status = Skyed::AWS::OpsWorks.deploy_status(deploy, opsworks)
128
+ while status[0] == 'running'
129
+ sleep(wait)
130
+ status = Skyed::AWS::OpsWorks.deploy_status(deploy, opsworks)
131
+ end
132
+ status
133
+ end
134
+
135
+ def deploy_status(deploy, opsworks)
136
+ deploy = opsworks.describe_deployments(
137
+ deployment_ids: [deploy[:deployment_id]])
138
+ deploy[:deployments].map do |s|
139
+ s[:status]
140
+ end.compact
141
+ end
142
+
143
+ def generate_deploy_params(stack_id, command, options = {})
144
+ options = {} if options.nil?
145
+ params = {
146
+ stack_id: stack_id,
147
+ command: generate_command_params(command)
148
+ }
149
+ params.merge(options)
150
+ end
151
+
152
+ def generate_command_params(options = {})
153
+ response = options
154
+ response = {
155
+ name: options[:name],
156
+ args: options.reject { |k, _v| k == :name }
157
+ } unless options[:name] != 'execute_recipes'
158
+ response
159
+ end
160
+
69
161
  def create_layer(layer_params, opsworks)
70
162
  layer = opsworks.create_layer(layer_params)
71
163
  Skyed::Settings.layer_id = layer.data[:layer_id]
@@ -179,6 +271,52 @@ module Skyed
179
271
  # This module encapsulates all the IAM related functions.
180
272
  module IAM
181
273
  class << self
274
+ def remove_user_from_group(user, group)
275
+ iam = login
276
+ puts "Removes #{user} from #{group}"
277
+ iam.remove_user_from_group(
278
+ group_name: group,
279
+ user_name: user)
280
+ rescue Aws::IAM::Errors::NoSuchEntity
281
+ puts "User #{user} already removed from group #{group}"
282
+ end
283
+
284
+ def clear_user_access_keys(user)
285
+ iam = login
286
+ iam.list_access_keys(
287
+ user_name: user)[:access_key_metadata].each do |access_key|
288
+ id = access_key.to_h[:access_key_id]
289
+ puts "Delete access key #{id}"
290
+ iam.delete_access_key(user_name: user, access_key_id: id)
291
+ end
292
+ rescue Aws::IAM::Errors::NoSuchEntity
293
+ puts "User #{user} access keys already removed"
294
+ end
295
+
296
+ def clear_user_policies(user)
297
+ iam = login
298
+ iam.list_user_policies(
299
+ user_name: user)[:policy_names].each do |policy|
300
+ puts "Delete user policy #{policy}"
301
+ iam.delete_user_policy(user_name: user, policy_name: policy)
302
+ end
303
+ rescue Aws::IAM::Errors::NoSuchEntity
304
+ puts "User #{user} policies already removed"
305
+ end
306
+
307
+ def delete_user(user)
308
+ iam = login
309
+ clear_user_policies user
310
+ clear_user_access_keys user
311
+ remove_user_from_group user, "OpsWorks-#{Skyed::Settings.stack_id}"
312
+ puts "Delete group OpsWorks-#{Skyed::Settings.stack_id}"
313
+ iam.delete_group(group_name: "OpsWorks-#{Skyed::Settings.stack_id}")
314
+ puts "Delete User #{user}"
315
+ iam.delete_user(user_name: user)
316
+ rescue Aws::IAM::Errors::NoSuchEntity
317
+ puts "User #{user} already removed"
318
+ end
319
+
182
320
  def login(
183
321
  access = Skyed::Settings.access_key,
184
322
  secret = Skyed::Settings.secret_key,
data/lib/skyed/destroy.rb CHANGED
@@ -7,11 +7,34 @@ module Skyed
7
7
  hostname = `cd #{repo_path} && vagrant ssh -c hostname`.strip
8
8
  `cd #{repo_path} && vagrant destroy -f`
9
9
  ow = Skyed::AWS::OpsWorks.login
10
- instances = ow.describe_instances(stack_id: Skyed::Settings.stack_id)
11
- instances[:instances].each do |instance|
12
- if instance[:hostname] == hostname
13
- ow.deregister_instance(instance_id: instance[:instance_id])
14
- end
10
+ deregister_instance hostname, ow
11
+ delete_user ow
12
+ end
13
+
14
+ def deregister_instance(hostname, ow)
15
+ instance = Skyed::AWS::OpsWorks.instance_by_name(
16
+ hostname, Skyed::Settings.stack_id, ow)
17
+ ow.deregister_instance(
18
+ instance_id: instance.instance_id) unless instance.nil?
19
+ wait_for_instance(
20
+ hostname, Skyed::Settings.stack_id, ow)
21
+ end
22
+
23
+ def delete_user(ow)
24
+ stack = ow.describe_stacks(
25
+ stack_ids: [Skyed::Settings.stack_id])[:stacks][0][:name]
26
+ layer = ow.describe_layers(
27
+ layer_ids: [Skyed::Settings.layer_id])[:layers][0][:name]
28
+ Skyed::AWS::IAM.delete_user "OpsWorks-#{stack}-#{layer}"
29
+ end
30
+
31
+ def wait_for_instance(hostname, stack_id, opsworks)
32
+ instance = Skyed::AWS::OpsWorks.instance_by_name(
33
+ hostname, stack_id, opsworks)
34
+ until instance.nil? || instance.status == 'terminated'
35
+ sleep(0)
36
+ instance = Skyed::AWS::OpsWorks.instance_by_name(
37
+ hostname, stack_id, opsworks)
15
38
  end
16
39
  end
17
40
  end
data/lib/skyed/run.rb CHANGED
@@ -17,66 +17,36 @@ module Skyed
17
17
  ow = login
18
18
  Skyed::Settings.stack_id = stack(ow, options)
19
19
  Skyed::Settings.layer_id = layer(ow, options)
20
- instances = running_instances(ow, Skyed::Settings.layer_id)
20
+ instances = Skyed::AWS::OpsWorks.running_instances(
21
+ { layer_id: Skyed::Settings.layer_id },
22
+ ow)
21
23
  update_custom_cookbooks(ow, Skyed::Settings.stack_id, instances,
22
24
  options[:wait_interval])
23
25
  execute_recipes(ow, args, instances, options)
24
26
  end
25
27
 
26
- def deploy_status(ow, id)
27
- deploy = ow.describe_deployments(deployment_ids: [id[:deployment_id]])
28
- deploy[:deployments].map do |s|
29
- s[:status]
30
- end.compact
31
- end
32
-
33
- def wait_for_deploy(ow, deploy_id, wait = 0)
34
- status = deploy_status(ow, deploy_id)
35
- while status[0] == 'running'
36
- sleep(wait)
37
- status = deploy_status(ow, deploy_id)
38
- end
39
- fail 'Deployment failed' unless status[0] == 'successful'
40
- status
41
- end
42
-
43
28
  def update_custom_cookbooks(ow, stack_id, instances, wait = 0)
44
- command = { name: 'update_custom_cookbooks' }
45
- wait_for_deploy(ow, ow.create_deployment(
29
+ status = Skyed::AWS::OpsWorks.deploy(
46
30
  stack_id: stack_id,
31
+ command: { name: 'update_custom_cookbooks' },
47
32
  instance_ids: instances,
48
- command: command), wait)
49
- end
50
-
51
- def running_instances(ow, layer_id)
52
- instances = ow.describe_instances(layer_id: layer_id)
53
- instances[:instances].map do |instance|
54
- instance[:instance_id] if instance[:status] != 'stopped'
55
- end.compact
33
+ client: ow,
34
+ wait_interval: wait)
35
+ fail 'Deployment failed' unless status[0] == 'successful'
56
36
  end
57
37
 
58
38
  def layer(ow, options)
59
- layers = ow.describe_layers(stack_id: options[:stack])[:layers]
60
- layer = nil
61
- layers.each do |layer_reply|
62
- id = layer_reply[:layer_id]
63
- layer = id if id == options[:layer]
64
- end
39
+ layer = Skyed::AWS::OpsWorks.layer(options[:layer], ow)
65
40
  msg = "There's no such layer with id #{options[:layer]}"
66
41
  fail msg unless layer
67
- layer
42
+ layer[:layer_id]
68
43
  end
69
44
 
70
45
  def stack(ow, options)
71
- stacks = ow.describe_stacks[:stacks]
72
- stack = nil
73
- stacks.each do |stack_reply|
74
- id = stack_reply[:stack_id]
75
- stack = id if id == options[:stack]
76
- end
46
+ stack = Skyed::AWS::OpsWorks.stack(options[:stack], ow)
77
47
  msg = "There's no such stack with id #{options[:stack]}"
78
48
  fail msg unless stack
79
- stack
49
+ stack[:stack_id]
80
50
  end
81
51
 
82
52
  def login
@@ -104,24 +74,17 @@ module Skyed
104
74
  recipes
105
75
  end
106
76
 
107
- def execute_recipes(
108
- ow,
109
- recipes,
110
- instances = nil,
111
- options = {})
112
- options[:wait_interval] ||= 0
113
- options[:custom_json] ||= ''
114
- deploy_id = ow.create_deployment(
115
- execute_params(recipes, instances, options[:custom_json]))
116
- wait_for_deploy(ow, deploy_id, options[:wait_interval])
117
- end
118
-
119
- def execute_params(recipes, instances, custom_json)
120
- command = { name: 'execute_recipes', args: { recipes: recipes } }
121
- deploy_params = { stack_id: Skyed::Settings.stack_id, command: command }
122
- deploy_params[:custom_json] = custom_json unless custom_json.empty?
123
- deploy_params[:instance_ids] = instances unless instances.nil?
124
- deploy_params
77
+ def execute_recipes(ow, recipes, instances = nil, opts = {})
78
+ args = {
79
+ stack_id: Skyed::Settings.stack_id,
80
+ command: { name: 'execute_recipes', recipes: recipes },
81
+ instance_ids: instances,
82
+ client: ow,
83
+ wait_interval: opts[:wait_interval] || 0
84
+ }
85
+ args[:custom_json] = opts[:custom_json] if opts.key? :custom_json
86
+ status = Skyed::AWS::OpsWorks.deploy(args)
87
+ fail 'Deployment failed' unless status[0] == 'successful'
125
88
  end
126
89
 
127
90
  def recipe_in_cookbook(recipe)
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.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignasi Fosch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-04 00:00:00.000000000 Z
11
+ date: 2015-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git