skyed 0.1.4 → 0.1.5

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: fdc2aafbb0979d101620f458cbd8f17d9b06b240
4
- data.tar.gz: 92c11933e258486e5a232535454bd55350c8c0ba
3
+ metadata.gz: 2c46e5e72681a7be284fd66a907566388b020efa
4
+ data.tar.gz: 8ef8a62b6fb7dcb24252f74d514244c1299a4fe2
5
5
  SHA512:
6
- metadata.gz: c2bd1237fc72ad8c25c7969ea2bf69d6fda97e307311ba4b30c05437e1794760aaf83406e922f2e1af83b674bc50edfc296ba627f76a1391952e0c0a57ed5a61
7
- data.tar.gz: 7098f09576a42add8f0ce5391f420eff038e4d7331d030b23a0b5506c2a65e3a22a1cc999b0946a75453f0331f54a7fb035f18f179bc454ec17ff0fab8576653
6
+ metadata.gz: e1d94f210a7f91c6844e876c45f7b7650cde0b53f85483555f691f981ff9932b4a9d57a3e34909f91d1603d773457fdacf8a0d97f7181f6b65c9ca18eea875c8
7
+ data.tar.gz: 2623193f4441a5d00d29ad7a691fed3291b69eb9e42fa7f56c745dd3b8048818903c960530ee2335ecdb8e1b2dac9fcd4e04efa18a697fc06501b5b4cf979bed
@@ -1,3 +1,5 @@
1
+ require 'skyed/utils'
2
+ require 'skyed/aws'
1
3
  require 'skyed/destroy'
2
4
  require 'skyed/run'
3
5
  require 'skyed/deploy'
@@ -6,5 +8,5 @@ require 'skyed/settings'
6
8
 
7
9
  # Skyed is a set of tools for cloud computing
8
10
  module Skyed
9
- VERSION = '0.1.2'
11
+ VERSION = '0.1.5'
10
12
  end
@@ -0,0 +1,195 @@
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 OpsWorks related functions.
42
+ module OpsWorks
43
+ STACK = {
44
+ name: '',
45
+ region: '',
46
+ service_role_arn: '',
47
+ default_instance_profile_arn: '',
48
+ default_os: 'Ubuntu 12.04 LTS',
49
+ default_ssh_key_name: '',
50
+ custom_cookbooks_source: {
51
+ type: 'git'
52
+ },
53
+ configuration_manager: {
54
+ name: 'Chef',
55
+ version: '11.10'
56
+ },
57
+ use_custom_cookbooks: true,
58
+ use_opsworks_security_groups: false
59
+ }
60
+ LAYER = {
61
+ stack_id: nil,
62
+ type: 'custom',
63
+ name: '',
64
+ shortname: '',
65
+ custom_security_group_ids: []
66
+ }
67
+
68
+ class << self
69
+ def create_layer(layer_params, opsworks)
70
+ layer = opsworks.create_layer(layer_params)
71
+ Skyed::Settings.layer_id = layer.data[:layer_id]
72
+ end
73
+
74
+ def create_stack(stack_params, opsworks)
75
+ stack = opsworks.create_stack(stack_params)
76
+ Skyed::Settings.stack_id = stack.data[:stack_id]
77
+ end
78
+
79
+ def delete_stack(stack_name, opsworks)
80
+ total = count_instances(stack_name, opsworks)
81
+ error_msg = "Stack with name #{stack_name}"
82
+ error_msg += ' exists and contains instances'
83
+ fail error_msg unless total == 0
84
+ stack = stack_by_name(stack_name, opsworks)
85
+ opsworks.delete_stack(stack_id: stack[:stack_id])
86
+ end
87
+
88
+ def count_instances(stack_name, opsworks)
89
+ stack_summary = stack_summary_by_name(stack_name, opsworks)
90
+ return nil if stack_summary.nil?
91
+ total = stack_summary[:instances_count].values.compact.inject(:+) || 0
92
+ total
93
+ end
94
+
95
+ def stack_summary_by_name(stack_name, opsworks)
96
+ stack = stack_by_name(stack_name, opsworks)
97
+ opsworks.describe_stack_summary(
98
+ stack_id: stack[:stack_id])[:stack_summary] unless stack.nil?
99
+ end
100
+
101
+ def stack_by_name(stack_name, opsworks)
102
+ stacks(opsworks).select { |x| x[:name] == stack_name }[0] || nil
103
+ end
104
+
105
+ def stacks(opsworks)
106
+ opsworks.describe_stacks[:stacks]
107
+ end
108
+
109
+ def basic_stack_params
110
+ params = STACK
111
+ params[:name] = ENV['USER']
112
+ params[:region] = Skyed::AWS.region
113
+ params[:service_role_arn] = Skyed::Settings.role_arn
114
+ params[:default_instance_profile_arn] = Skyed::Settings.profile_arn
115
+ params[:default_ssh_key_name] = Skyed::Settings.aws_key_name
116
+ params
117
+ end
118
+
119
+ def custom_cookbooks_source(base_source)
120
+ base_source[:url] = Skyed::Settings.remote_url
121
+ base_source[:revision] = Skyed::Settings.branch
122
+ base_source[:ssh_key] = Skyed::Utils.read_key_file(
123
+ Skyed::Settings.opsworks_git_key)
124
+ base_source
125
+ end
126
+
127
+ def configuration_manager(base_config, options)
128
+ base_config[:name] = 'Chef'
129
+ base_config[:version] = options[:chef_version] || '11.10'
130
+ base_config
131
+ end
132
+
133
+ def generate_params(stack_id = nil, options = {})
134
+ params = generate_layer_params(stack_id) unless stack_id.nil?
135
+ params = generate_stack_params(options) if stack_id.nil?
136
+ params
137
+ end
138
+
139
+ def generate_layer_params(stack_id)
140
+ params = LAYER
141
+ params[:stack_id] = stack_id
142
+ params[:name] = "test-#{ENV['USER']}"
143
+ params[:shortname] = "test-#{ENV['USER']}"
144
+ params[:custom_security_group_ids] = ['sg-f1cc2498']
145
+ params
146
+ end
147
+
148
+ def generate_stack_params(options)
149
+ params = basic_stack_params
150
+ params[:custom_cookbooks_source] = custom_cookbooks_source(
151
+ STACK[:custom_cookbooks_source])
152
+ params[:configuration_manager] = configuration_manager(
153
+ STACK[:configuration_manager], options)
154
+ puts params
155
+ params
156
+ end
157
+
158
+ def login(
159
+ access = Skyed::Settings.access_key,
160
+ secret = Skyed::Settings.secret_key,
161
+ region = Skyed::AWS.region)
162
+ Aws::OpsWorks::Client.new(
163
+ access_key_id: access,
164
+ secret_access_key: secret,
165
+ region: region)
166
+ end
167
+
168
+ def set_arns(service_role = nil, instance_profile = nil)
169
+ iam = Skyed::AWS::IAM.login
170
+ Skyed::Settings.role_arn = service_role || iam.get_role(
171
+ role_name: 'aws-opsworks-service-role')[:role][:arn]
172
+ Skyed::Settings.profile_arn = instance_profile || iam
173
+ .get_instance_profile(
174
+ instance_profile_name: 'aws-opsworks-ec2-role'
175
+ )[:instance_profile][:arn]
176
+ end
177
+ end
178
+ end
179
+
180
+ # This module encapsulates all the IAM related functions.
181
+ module IAM
182
+ class << self
183
+ def login(
184
+ access = Skyed::Settings.access_key,
185
+ secret = Skyed::Settings.secret_key,
186
+ region = Skyed::AWS.region)
187
+ Aws::IAM::Client.new(
188
+ access_key_id: access,
189
+ secret_access_key: secret,
190
+ region: region)
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
@@ -5,6 +5,9 @@ command :init do |cmd|
5
5
  cmd.flag :remote, default_value: nil,
6
6
  type: String,
7
7
  desc: 'Remote to use in OpsWorks'
8
+ cmd.flag :chef_version, default_value: '11.10',
9
+ type: String,
10
+ desc: 'Chef version to use in OpsWorks'
8
11
  cmd.action do |global_options, options|
9
12
  Skyed::Init.execute(global_options, options)
10
13
  end
@@ -6,7 +6,7 @@ module Skyed
6
6
  repo_path = Skyed::Settings.repo
7
7
  hostname = `cd #{repo_path} && vagrant ssh -c hostname`.strip
8
8
  `cd #{repo_path} && vagrant destroy -f`
9
- ow = Skyed::Init.ow_client
9
+ ow = Skyed::AWS::OpsWorks.login
10
10
  instances = ow.describe_instances(stack_id: Skyed::Settings.stack_id)
11
11
  instances[:instances].each do |instance|
12
12
  if instance[:hostname] == hostname
@@ -6,26 +6,6 @@ require 'aws-sdk'
6
6
  require 'highline/import'
7
7
  require 'digest/sha1'
8
8
 
9
- ACCESS_QUESTION = 'What is your AWS Access Key? '
10
- SECRET_QUESTION = 'What is your AWS Secret Key? '
11
-
12
- STACK = { name: '',
13
- region: '',
14
- service_role_arn: '',
15
- default_instance_profile_arn: '',
16
- default_os: 'Ubuntu 12.04 LTS',
17
- default_ssh_key_name: '',
18
- custom_cookbooks_source: {
19
- type: 'git'
20
- },
21
- configuration_manager: {
22
- name: 'Chef',
23
- version: '11.10'
24
- },
25
- use_custom_cookbooks: true,
26
- use_opsworks_security_groups: false
27
- }
28
-
29
9
  module Skyed
30
10
  # This module encapsulates all the init command steps.
31
11
  module Init
@@ -36,86 +16,26 @@ module Skyed
36
16
  branch global_options, options
37
17
  credentials
38
18
  opsworks_git_key
39
- opsworks
19
+ opsworks options
40
20
  vagrant
41
21
  Skyed::Settings.save
42
22
  end
43
23
 
44
- def opsworks
45
- opsworks = ow_client
46
- params = stack_params
24
+ def opsworks(options = {})
25
+ opsworks = Skyed::AWS::OpsWorks.login
26
+ params = Skyed::AWS::OpsWorks.generate_params nil, options
47
27
  check_stack(opsworks, params[:name])
48
- stack = opsworks.create_stack(params).data[:stack_id]
49
- Skyed::Settings.stack_id = stack
50
- Skyed::Settings.layer_id = opsworks.create_layer(
51
- layer_params(stack)).data[:layer_id]
28
+ Skyed::AWS::OpsWorks.create_stack(params, opsworks)
29
+ params = Skyed::AWS::OpsWorks.generate_params(Skyed::Settings.stack_id)
30
+ Skyed::AWS::OpsWorks.create_layer(params, opsworks)
52
31
  end
53
32
 
54
33
  def check_stack(ow, name)
55
- stacks = ow.describe_stacks[:stacks]
56
- stack = stacks.select { |x| x[:name] == name }[0] || return
57
- stack_summ = ow.describe_stack_summary(stack_id: stack[:stack_id])
58
- delete_stack(ow, stack_summ[:stack_summary])
59
- end
60
-
61
- def delete_stack(ow, stack_summ)
62
- total = stack_summ[:instances_count].values.compact.inject(:+)
63
- total ||= 0
64
- error_msg = "Stack with name #{stack_summ[:name]}"
65
- error_msg += ' exists and contains instances'
66
- fail error_msg unless total == 0
67
- ow.delete_stack(stack_id: stack_summ[:stack_id])
34
+ stack = Skyed::AWS::OpsWorks.stack_summary_by_name(name, ow)
35
+ Skyed::AWS::OpsWorks.delete_stack(stack[:name], ow) unless stack.nil?
68
36
  File.delete(vagrantfile) if File.exist?(vagrantfile)
69
37
  end
70
38
 
71
- def layer_params(stack_id)
72
- # TODO: Include extra layer parameters
73
- { stack_id: stack_id,
74
- type: 'custom',
75
- name: "test-#{ENV['USER']}",
76
- shortname: "test-#{ENV['USER']}",
77
- custom_security_group_ids: ['sg-f1cc2498'] }
78
- end
79
-
80
- def stack_params
81
- # TODO: Include extra stack parameters
82
- result = STACK
83
- result[:name] = ENV['USER']
84
- result[:region] = region
85
- result[:service_role_arn] = Skyed::Settings.role_arn
86
- result[:default_instance_profile_arn] = Skyed::Settings.profile_arn
87
- result[:default_ssh_key_name] = Skyed::Settings.aws_key_name
88
- result[:custom_cookbooks_source] = custom_cookbooks_source(
89
- STACK[:custom_cookbooks_source])
90
- result
91
- end
92
-
93
- def custom_cookbooks_source(base_source)
94
- base_source[:url] = Skyed::Settings.remote_url
95
- base_source[:revision] = Skyed::Settings.branch
96
- base_source[:ssh_key] = read_key_file(Skyed::Settings.opsworks_git_key)
97
- base_source
98
- end
99
-
100
- def read_key_file(key_file)
101
- File.open(key_file, 'rb').read
102
- end
103
-
104
- def region
105
- ENV['DEFAULT_REGION'] || 'us-east-1'
106
- end
107
-
108
- def ow_client(
109
- access = Skyed::Settings.access_key,
110
- secret = Skyed::Settings.secret_key,
111
- region = ENV['AWS_REGION'])
112
- region ||= 'us-east-1'
113
- Aws::OpsWorks::Client.new(
114
- access_key_id: access,
115
- secret_access_key: secret,
116
- region: region)
117
- end
118
-
119
39
  def vagrantfile
120
40
  File.join(Skyed::Settings.repo, 'Vagrantfile')
121
41
  end
@@ -220,44 +140,11 @@ module Skyed
220
140
  role_arn = ENV['OW_SERVICE_ROLE'],
221
141
  profile_arn = ENV['OW_INSTANCE_PROFILE'],
222
142
  aws_key_name = ENV['AWS_SSH_KEY_NAME'])
223
- iam = aws_access_key(access, secret)
224
- set_arns(iam, profile_arn, role_arn)
143
+ Skyed::AWS.set_credentials(access, secret)
144
+ Skyed::AWS::OpsWorks.set_arns(profile_arn, role_arn)
225
145
  Skyed::Settings.aws_key_name = aws_key_name
226
146
  end
227
147
 
228
- def set_arns(iam, profile_arn, role_arn)
229
- Skyed::Settings.role_arn = role_arn || iam
230
- .get_role(role_name: 'aws-opsworks-service-role')[:role][:arn]
231
- key = :instance_profile
232
- Skyed::Settings.profile_arn = profile_arn || iam
233
- .get_instance_profile(
234
- instance_profile_name: 'aws-opsworks-ec2-role')[key][:arn]
235
- end
236
-
237
- def aws_access_key(access, secret)
238
- access = ask(ACCESS_QUESTION) unless valid_credential?('AWS_ACCESS_KEY')
239
- secret = ask(SECRET_QUESTION) unless valid_credential?('AWS_SECRET_KEY')
240
- iam = iam_client(access, secret)
241
- Skyed::Settings.access_key = access
242
- Skyed::Settings.secret_key = secret
243
- iam
244
- end
245
-
246
- def iam_client(
247
- access = Skyed::Settings.access_key,
248
- secret = Skyed::Settings.secret_key,
249
- region = ENV['AWS_REGION'])
250
- region ||= 'us-east-1'
251
- Aws::IAM::Client.new(
252
- access_key_id: access,
253
- secret_access_key: secret,
254
- region: region)
255
- end
256
-
257
- def valid_credential?(env_name)
258
- ENV[env_name] != '' && !ENV[env_name].nil?
259
- end
260
-
261
148
  def repo_path(repo)
262
149
  Pathname.new(repo.repo.path).dirname
263
150
  end
@@ -8,7 +8,7 @@ module Skyed
8
8
  else
9
9
  recipes = check_recipes_exist(args)
10
10
  check_vagrant
11
- execute_recipes(Skyed::Init.ow_client, recipes)
11
+ execute_recipes(Skyed::AWS::OpsWorks.login, recipes)
12
12
  end
13
13
  end
14
14
 
@@ -80,7 +80,7 @@ module Skyed
80
80
 
81
81
  def login
82
82
  Skyed::Init.credentials if Skyed::Settings.empty?
83
- Skyed::Init.ow_client
83
+ Skyed::AWS::OpsWorks.login
84
84
  end
85
85
 
86
86
  def check_run_options(options)
@@ -0,0 +1,10 @@
1
+ module Skyed
2
+ # This module encapsulates some generic utility functions.
3
+ module Utils
4
+ class << self
5
+ def read_key_file(key_file)
6
+ File.open(key_file, 'rb').read
7
+ end
8
+ end
9
+ end
10
+ end
@@ -9,7 +9,7 @@
9
9
  aws_opsworks_layer_id: ´{{ aws_opsworks_layer_id }}´
10
10
  tasks:
11
11
  - name: Install pip
12
- apt: name=python-pip
12
+ apt: name=python-pip update_cache=yes
13
13
  - name: Install AWS CLI
14
14
  pip: name=awscli
15
15
  - name: Prepare directory for AWS credentials
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.4
4
+ version: 0.1.5
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-04-15 00:00:00.000000000 Z
11
+ date: 2015-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -75,12 +75,14 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - bin/skyed
77
77
  - lib/skyed.rb
78
+ - lib/skyed/aws.rb
78
79
  - lib/skyed/commands.rb
79
80
  - lib/skyed/deploy.rb
80
81
  - lib/skyed/destroy.rb
81
82
  - lib/skyed/init.rb
82
83
  - lib/skyed/run.rb
83
84
  - lib/skyed/settings.rb
85
+ - lib/skyed/utils.rb
84
86
  - templates/Vagrantfile.erb
85
87
  - templates/config.j2.erb
86
88
  - templates/credentials.j2.erb