jnewland-capsize 0.5.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.
- data/History.txt +18 -0
- data/License.txt +67 -0
- data/Manifest.txt +24 -0
- data/README.textile +78 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +76 -0
- data/config/requirements.rb +18 -0
- data/examples/capsize.yml.template +67 -0
- data/examples/deploy.rb +29 -0
- data/lib/capsize/capsize.rb +101 -0
- data/lib/capsize/configuration.rb +44 -0
- data/lib/capsize/ec2.rb +515 -0
- data/lib/capsize/ec2_plugin.rb +568 -0
- data/lib/capsize/meta_tasks.rb +156 -0
- data/lib/capsize/sqs.rb +57 -0
- data/lib/capsize/sqs_plugin.rb +128 -0
- data/lib/capsize/version.rb +9 -0
- data/lib/capsize.rb +26 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +27 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_capsize.rb +12 -0
- data/test/test_helper.rb +10 -0
- metadata +130 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :ec2 do
|
4
|
+
|
5
|
+
namespace :setup do
|
6
|
+
|
7
|
+
desc <<-DESC
|
8
|
+
Initialize Capsize config.
|
9
|
+
You can run this command as often as you like.
|
10
|
+
It will not overwrite config files on multiple runs.
|
11
|
+
- Create :capsize_config_dir
|
12
|
+
- Create :capsize_secure_config_dir
|
13
|
+
- Copy capsize.yml.template to :capsize_config_dir/capsize.yml unless it already exists
|
14
|
+
- Automatically generate :capsize_secure_config_dir/secure.yml unless it already exists
|
15
|
+
- Instruct user to test configuration with "cap ec2:images:describe"
|
16
|
+
- Instruct user how to create a new keypair
|
17
|
+
- Instruct user how to setup a new security group.
|
18
|
+
DESC
|
19
|
+
task :default do
|
20
|
+
|
21
|
+
# Make the standard config dir if it doesn't exist already
|
22
|
+
unless File.exists?(fetch(:capsize_config_dir))
|
23
|
+
FileUtils.mkdir fetch(:capsize_config_dir)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Make the secure config dir if it doesn't exist already
|
27
|
+
unless File.exists?(fetch(:capsize_secure_config_dir))
|
28
|
+
FileUtils.mkdir fetch(:capsize_secure_config_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
# copy the standard config file template, unless the dest file alread exists
|
32
|
+
unless File.exists?("#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}")
|
33
|
+
puts "Please enter your EC2 account information."
|
34
|
+
puts "We'll then write it to a config file at #{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
35
|
+
|
36
|
+
require "yaml"
|
37
|
+
set :aws_access_key_id, proc { Capistrano::CLI.ui.ask("AWS Access Key ID : ") }
|
38
|
+
set :aws_secret_access_key, proc { Capistrano::CLI.ui.ask("AWS Secret Access Key : ") }
|
39
|
+
|
40
|
+
yaml = {}
|
41
|
+
|
42
|
+
# Populate production element
|
43
|
+
yaml['common'] = {}
|
44
|
+
yaml['common']['aws_access_key_id'] = aws_access_key_id
|
45
|
+
yaml['common']['aws_secret_access_key'] = aws_secret_access_key
|
46
|
+
|
47
|
+
yaml = YAML::dump(yaml).split("\n").collect { |line| line == "common: " ? line += "&common" : line }.join("\n")
|
48
|
+
|
49
|
+
env_config =<<EOF
|
50
|
+
|
51
|
+
|
52
|
+
development:
|
53
|
+
<<: *common
|
54
|
+
|
55
|
+
# Uncomment and I only apply to the dev environment
|
56
|
+
# or overwrite a common value
|
57
|
+
#foo: 'bar'
|
58
|
+
|
59
|
+
test:
|
60
|
+
<<: *common
|
61
|
+
|
62
|
+
staging:
|
63
|
+
<<: *common
|
64
|
+
|
65
|
+
production:
|
66
|
+
<<: *common
|
67
|
+
|
68
|
+
# Uncomment and I only apply to the production environment
|
69
|
+
# or overwrite a common value
|
70
|
+
#foo: 'baz'
|
71
|
+
EOF
|
72
|
+
|
73
|
+
yaml += env_config
|
74
|
+
|
75
|
+
File.open("#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}", 'w') do |file|
|
76
|
+
file.write(yaml)
|
77
|
+
end
|
78
|
+
File.chmod 0664, "#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
79
|
+
else
|
80
|
+
puts "Warning : The following file was not copied over since it already exists: " + "#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
81
|
+
end
|
82
|
+
|
83
|
+
unless File.exists?("#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}")
|
84
|
+
FileUtils.cp("#{fetch(:capsize_examples_dir)}/capsize.yml.template", "#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}", :verbose => true)
|
85
|
+
else
|
86
|
+
puts "Warning : The following file was not copied over since it already exists: " + "#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}"
|
87
|
+
end
|
88
|
+
|
89
|
+
check
|
90
|
+
|
91
|
+
ec2.keypairs.create
|
92
|
+
|
93
|
+
ec2.security_groups.create_with_standard_ports
|
94
|
+
|
95
|
+
message = <<-MESSAGE
|
96
|
+
|
97
|
+
Next up: Pick an Amazon Machine Image and Run it!
|
98
|
+
|
99
|
+
Now you need to select an Amazon EC2 image ID that you want to start as a new
|
100
|
+
instance. The easiest way to do that is to get a list of available images from EC2.
|
101
|
+
|
102
|
+
# Show ALL registered images
|
103
|
+
cap ec2:images:show
|
104
|
+
|
105
|
+
# Show MY registered images
|
106
|
+
cap ec2:images:show OWNER_ID='self'
|
107
|
+
|
108
|
+
# Show the AMAZON registered images
|
109
|
+
cap ec2:images:show OWNER_ID='amazon'
|
110
|
+
|
111
|
+
Select an 'imageId' from the results, and run it:
|
112
|
+
|
113
|
+
cap ec2:instances:run IMAGE_ID='ami-2bb65342'
|
114
|
+
|
115
|
+
You should see some progress information scroll by and finally you should see
|
116
|
+
a description of the key attributes of your running intance (dnsName and instanceId
|
117
|
+
are likely most important).
|
118
|
+
|
119
|
+
Now lets connect to it with SSH (this may take a few tries, sometimes it takes a
|
120
|
+
minute for the new instance to respond to SSH):
|
121
|
+
|
122
|
+
cap ec2:instances:ssh INSTANCE_ID='i-xxxxxx'
|
123
|
+
|
124
|
+
If you want to terminate your instance...
|
125
|
+
|
126
|
+
cap ec2:instances:terminate INSTANCE_ID='i-xxxxxx'
|
127
|
+
|
128
|
+
Enjoy Capsize!
|
129
|
+
|
130
|
+
MESSAGE
|
131
|
+
|
132
|
+
puts message
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
desc <<-DESC
|
137
|
+
Test your Capsize config.
|
138
|
+
Run a simple test which will validate that your Capsize config
|
139
|
+
is setup and working properly when querying the Amazon EC2 servers.
|
140
|
+
DESC
|
141
|
+
task :check do
|
142
|
+
|
143
|
+
begin
|
144
|
+
capsize_ec2.describe_images(:owner_id => "amazon")
|
145
|
+
puts "Congratulations! Your credentials are verified and you are communicating properly with Amazon's EC2 service."
|
146
|
+
rescue Exception => e
|
147
|
+
puts "The test of your Capsize config failed with the following error: " + e
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
data/lib/capsize/sqs.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :sqs do
|
4
|
+
|
5
|
+
namespace :messages do
|
6
|
+
|
7
|
+
task :receive do
|
8
|
+
message = capsize_sqs.receive_message
|
9
|
+
unless message.nil?
|
10
|
+
puts message.body
|
11
|
+
else
|
12
|
+
puts "No Message"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
task :send_message do
|
17
|
+
raise Exception, "message required" if capsize.get(:message).nil? || capsize.get(:message).empty?
|
18
|
+
begin
|
19
|
+
capsize_sqs.send_message(capsize.get(:message))
|
20
|
+
rescue Exception => e
|
21
|
+
raise e
|
22
|
+
else
|
23
|
+
puts "Message sent to #{capsize.get(:queue_name)} Queue"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :queue do
|
30
|
+
|
31
|
+
task :delete do
|
32
|
+
begin
|
33
|
+
raise Exception unless capsize_sqs.delete
|
34
|
+
rescue Exception => e
|
35
|
+
puts "Queue #{queue_name} not deleted"
|
36
|
+
raise e
|
37
|
+
else
|
38
|
+
puts "Queue #{queue_name} deleted"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
task :delete! do
|
43
|
+
begin
|
44
|
+
raise Exception unless capsize_sqs.delete!
|
45
|
+
rescue Exception => e
|
46
|
+
puts "Queue #{queue_name} not deleted"
|
47
|
+
raise e
|
48
|
+
else
|
49
|
+
puts "Queue #{queue_name} deleted"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Capsize
|
2
|
+
module CapsizeSQS
|
3
|
+
include Capsize
|
4
|
+
|
5
|
+
#Creqte the XML for our CapQueue messages
|
6
|
+
def build_xml
|
7
|
+
body = ""
|
8
|
+
xml = Builder::XmlMarkup.new(:target => body, :indent => 2)
|
9
|
+
xml.command do
|
10
|
+
xml.hosts do
|
11
|
+
get(:hosts).split(/,/).each do |host|
|
12
|
+
xml.host host
|
13
|
+
end unless get(:hosts).nil?
|
14
|
+
end
|
15
|
+
xml.environment do
|
16
|
+
get(:environment).split(/,/).each do |keyvar|
|
17
|
+
xml.variable do
|
18
|
+
key, var = keyvar.split(/=/,2)
|
19
|
+
var.gsub!(/("|')/,'')
|
20
|
+
xml.key key
|
21
|
+
xml.var var
|
22
|
+
end
|
23
|
+
end unless get(:environment).nil?
|
24
|
+
end
|
25
|
+
xml.variables do
|
26
|
+
get(:variables).split(/,/).each do |keyvar|
|
27
|
+
xml.variable do
|
28
|
+
key, var = keyvar.split(/=/,2)
|
29
|
+
var.gsub!(/("|')/,'')
|
30
|
+
xml.key key
|
31
|
+
xml.var var
|
32
|
+
end
|
33
|
+
end unless get(:variables).nil?
|
34
|
+
end
|
35
|
+
xml.task get(:task)
|
36
|
+
end
|
37
|
+
body
|
38
|
+
end
|
39
|
+
|
40
|
+
#returns an instance of SQS::Queue
|
41
|
+
def connect
|
42
|
+
set :aws_access_key_id, get(:aws_access_key_id)
|
43
|
+
set :aws_secret_access_key, get(:aws_secret_access_key)
|
44
|
+
|
45
|
+
raise Exception, "You must have an :aws_access_key_id defined in your config." if fetch(:aws_access_key_id).nil? || fetch(:aws_access_key_id).empty?
|
46
|
+
raise Exception, "You must have an :aws_secret_access_key defined in your config." if fetch(:aws_secret_access_key).nil? || fetch(:aws_secret_access_key).empty?
|
47
|
+
|
48
|
+
SQS.access_key_id = fetch(:aws_access_key_id)
|
49
|
+
SQS.secret_access_key = fetch(:aws_secret_access_key)
|
50
|
+
|
51
|
+
queue = nil
|
52
|
+
begin
|
53
|
+
queue = SQS.get_queue queue_name
|
54
|
+
rescue
|
55
|
+
queue = SQS.create_queue queue_name
|
56
|
+
ensure
|
57
|
+
return queue
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete( options=nil )
|
62
|
+
queue = connect()
|
63
|
+
queue.delete(options)
|
64
|
+
end
|
65
|
+
|
66
|
+
def delete!
|
67
|
+
queue = connect()
|
68
|
+
queue.delete!
|
69
|
+
end
|
70
|
+
|
71
|
+
def send_message( m )
|
72
|
+
queue = connect()
|
73
|
+
queue.send_message(m)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_queue_attributes( force=false )
|
77
|
+
queue = connect()
|
78
|
+
queue.get_queue_attributes(force)
|
79
|
+
end
|
80
|
+
|
81
|
+
def set_queue_attributes( atts={} )
|
82
|
+
queue = connect()
|
83
|
+
queue.set_queue_attributes(atts)
|
84
|
+
end
|
85
|
+
|
86
|
+
def empty?
|
87
|
+
queue = connect()
|
88
|
+
queue.empty?
|
89
|
+
end
|
90
|
+
|
91
|
+
def peek_message
|
92
|
+
queue = connect()
|
93
|
+
queue.peek_message
|
94
|
+
end
|
95
|
+
|
96
|
+
def peek_messages( options={} )
|
97
|
+
queue = connect()
|
98
|
+
queue.peek_messages(options)
|
99
|
+
end
|
100
|
+
|
101
|
+
def receive_message
|
102
|
+
queue = connect()
|
103
|
+
queue.receive_message
|
104
|
+
end
|
105
|
+
|
106
|
+
def receive_messages( options={} )
|
107
|
+
queue = connect()
|
108
|
+
queue.receive_messages(options)
|
109
|
+
end
|
110
|
+
|
111
|
+
def add_grant( options={} )
|
112
|
+
queue = connect()
|
113
|
+
queue.add_grant(options)
|
114
|
+
end
|
115
|
+
|
116
|
+
def remove_grant( options={} )
|
117
|
+
queue = connect()
|
118
|
+
queue.remove_grant(options)
|
119
|
+
end
|
120
|
+
|
121
|
+
def list_grants
|
122
|
+
queue = connect()
|
123
|
+
queue.list_grants
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
Capistrano.plugin :capsize_sqs, Capsize::CapsizeSQS
|
data/lib/capsize.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Require all necessary libraries
|
2
|
+
%w[
|
3
|
+
rubygems
|
4
|
+
ostruct
|
5
|
+
yaml
|
6
|
+
fileutils
|
7
|
+
builder
|
8
|
+
capistrano
|
9
|
+
EC2
|
10
|
+
sqs
|
11
|
+
capsize/version
|
12
|
+
capsize/capsize.rb
|
13
|
+
capsize/meta_tasks
|
14
|
+
capsize/ec2
|
15
|
+
capsize/ec2_plugin
|
16
|
+
capsize/sqs
|
17
|
+
capsize/sqs_plugin
|
18
|
+
capsize/configuration
|
19
|
+
].each { |lib|
|
20
|
+
begin
|
21
|
+
require lib
|
22
|
+
rescue Exception => e
|
23
|
+
puts "The loading of '#{lib}' failed in capsize.rb with message : " + e
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
}
|