sml-rubber 0.9.1

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.
Files changed (147) hide show
  1. data/COPYING +339 -0
  2. data/README +6 -0
  3. data/TODO +9 -0
  4. data/VERSION +1 -0
  5. data/generators/vulcanize/USAGE +6 -0
  6. data/generators/vulcanize/templates/apache/config/rubber/deploy-apache.rb +45 -0
  7. data/generators/vulcanize/templates/apache/config/rubber/role/web/deflate.conf +10 -0
  8. data/generators/vulcanize/templates/apache/config/rubber/role/web/expires.conf +9 -0
  9. data/generators/vulcanize/templates/apache/config/rubber/role/web/headers.conf +6 -0
  10. data/generators/vulcanize/templates/apache/config/rubber/role/web/setenvif.conf +52 -0
  11. data/generators/vulcanize/templates/apache/config/rubber/role/web/vhost.conf +27 -0
  12. data/generators/vulcanize/templates/apache/config/rubber/rubber-apache.yml +15 -0
  13. data/generators/vulcanize/templates/apache/templates.yml +1 -0
  14. data/generators/vulcanize/templates/base/Capfile +17 -0
  15. data/generators/vulcanize/templates/base/config/deploy.rb +77 -0
  16. data/generators/vulcanize/templates/base/config/rubber/common/crontab +16 -0
  17. data/generators/vulcanize/templates/base/config/rubber/common/profile.rc +9 -0
  18. data/generators/vulcanize/templates/base/config/rubber/deploy-setup.rb +56 -0
  19. data/generators/vulcanize/templates/base/config/rubber/rubber.yml +221 -0
  20. data/generators/vulcanize/templates/base/lib/tasks/rubber.rake +18 -0
  21. data/generators/vulcanize/templates/base/script/cron-rake +18 -0
  22. data/generators/vulcanize/templates/base/script/cron-runner +18 -0
  23. data/generators/vulcanize/templates/base/script/cron-sh +67 -0
  24. data/generators/vulcanize/templates/base/templates.yml +1 -0
  25. data/generators/vulcanize/templates/complete_mysql/templates.yml +6 -0
  26. data/generators/vulcanize/templates/complete_passenger_mysql/templates.yml +8 -0
  27. data/generators/vulcanize/templates/cruise/config/rubber/deploy-cruise.rb +74 -0
  28. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/cruise +40 -0
  29. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/my.cnf +165 -0
  30. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/production.rb +8 -0
  31. data/generators/vulcanize/templates/cruise/config/rubber/role/cruise/site_config.rb +76 -0
  32. data/generators/vulcanize/templates/cruise/config/rubber/role/web_tools/cruise-nginx.conf +11 -0
  33. data/generators/vulcanize/templates/cruise/config/rubber/rubber-cruise.yml +18 -0
  34. data/generators/vulcanize/templates/cruise/templates.yml +1 -0
  35. data/generators/vulcanize/templates/haproxy/config/rubber/deploy-haproxy.rb +45 -0
  36. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-default.conf +8 -0
  37. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy.conf +44 -0
  38. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/monit-haproxy.conf +9 -0
  39. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslog-haproxy.conf +6 -0
  40. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/syslogd-default.conf +17 -0
  41. data/generators/vulcanize/templates/haproxy/config/rubber/role/web_tools/haproxy-nginx.conf +10 -0
  42. data/generators/vulcanize/templates/haproxy/config/rubber/rubber-haproxy.yml +12 -0
  43. data/generators/vulcanize/templates/haproxy/templates.yml +1 -0
  44. data/generators/vulcanize/templates/memcached/config/memcached.yml +28 -0
  45. data/generators/vulcanize/templates/memcached/config/rubber/common/memcached.yml +14 -0
  46. data/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached.conf +52 -0
  47. data/generators/vulcanize/templates/memcached/config/rubber/role/memcached/memcached_munin_plugin +249 -0
  48. data/generators/vulcanize/templates/memcached/config/rubber/rubber-memcached.yml +7 -0
  49. data/generators/vulcanize/templates/memcached/templates.yml +1 -0
  50. data/generators/vulcanize/templates/minimal_mysql/templates.yml +7 -0
  51. data/generators/vulcanize/templates/minimal_nodb/templates.yml +6 -0
  52. data/generators/vulcanize/templates/mongrel/config/rubber/deploy-mongrel.rb +75 -0
  53. data/generators/vulcanize/templates/mongrel/config/rubber/role/app/mongrel_cluster.yml +12 -0
  54. data/generators/vulcanize/templates/mongrel/config/rubber/role/app/monit-mongrel.conf +20 -0
  55. data/generators/vulcanize/templates/mongrel/config/rubber/rubber-mongrel.yml +9 -0
  56. data/generators/vulcanize/templates/mongrel/templates.yml +1 -0
  57. data/generators/vulcanize/templates/monit/config/rubber/common/monit-default.conf +15 -0
  58. data/generators/vulcanize/templates/monit/config/rubber/common/monit.conf +251 -0
  59. data/generators/vulcanize/templates/monit/config/rubber/deploy-monit.rb +32 -0
  60. data/generators/vulcanize/templates/monit/config/rubber/role/web_tools/monit-admin-nginx.conf +10 -0
  61. data/generators/vulcanize/templates/monit/config/rubber/rubber-monit.yml +6 -0
  62. data/generators/vulcanize/templates/monit/templates.yml +1 -0
  63. data/generators/vulcanize/templates/munin/config/rubber/common/monit-munin.conf +8 -0
  64. data/generators/vulcanize/templates/munin/config/rubber/common/munin-node.conf +48 -0
  65. data/generators/vulcanize/templates/munin/config/rubber/deploy-munin.rb +30 -0
  66. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-nginx.conf +8 -0
  67. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-plugins.conf +31 -0
  68. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin.conf +80 -0
  69. data/generators/vulcanize/templates/munin/config/rubber/rubber-munin.yml +8 -0
  70. data/generators/vulcanize/templates/munin/script/munin/example_mysql_query.rb +57 -0
  71. data/generators/vulcanize/templates/munin/script/munin/example_simple.rb +24 -0
  72. data/generators/vulcanize/templates/munin/templates.yml +1 -0
  73. data/generators/vulcanize/templates/mysql/config/rubber/common/database.yml +11 -0
  74. data/generators/vulcanize/templates/mysql/config/rubber/deploy-mysql.rb +178 -0
  75. data/generators/vulcanize/templates/mysql/config/rubber/role/db/crontab +14 -0
  76. data/generators/vulcanize/templates/mysql/config/rubber/role/db/monit-mysql.cnf +10 -0
  77. data/generators/vulcanize/templates/mysql/config/rubber/role/db/my.cnf +167 -0
  78. data/generators/vulcanize/templates/mysql/config/rubber/role/mysql_slave/mysql_slave_munin_plugin +51 -0
  79. data/generators/vulcanize/templates/mysql/config/rubber/rubber-mysql.yml +38 -0
  80. data/generators/vulcanize/templates/mysql/templates.yml +1 -0
  81. data/generators/vulcanize/templates/mysql_cluster/config/rubber/common/mysql_cluster_migrations.rb +13 -0
  82. data/generators/vulcanize/templates/mysql_cluster/config/rubber/deploy-mysql_cluster.rb +173 -0
  83. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_data/my.cnf +15 -0
  84. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_mgm/ndb_mgmd.cnf +39 -0
  85. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/monit-mysql_cluster_sql.cnf +10 -0
  86. data/generators/vulcanize/templates/mysql_cluster/config/rubber/role/mysql_sql/my.cnf +23 -0
  87. data/generators/vulcanize/templates/mysql_cluster/config/rubber/rubber-mysql_cluster.yml +32 -0
  88. data/generators/vulcanize/templates/mysql_cluster/templates.yml +1 -0
  89. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/database.yml +16 -0
  90. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/monit-mysql_proxy.cnf +10 -0
  91. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy +153 -0
  92. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.conf +10 -0
  93. data/generators/vulcanize/templates/mysql_proxy/config/rubber/common/mysql-proxy.lua +5 -0
  94. data/generators/vulcanize/templates/mysql_proxy/config/rubber/deploy-mysql_proxy.rb +52 -0
  95. data/generators/vulcanize/templates/mysql_proxy/config/rubber/rubber-mysql_proxy.yml +11 -0
  96. data/generators/vulcanize/templates/mysql_proxy/templates.yml +1 -0
  97. data/generators/vulcanize/templates/nginx/config/rubber/deploy-nginx.rb +45 -0
  98. data/generators/vulcanize/templates/nginx/config/rubber/role/web/crontab +9 -0
  99. data/generators/vulcanize/templates/nginx/config/rubber/role/web/monit-nginx.conf +9 -0
  100. data/generators/vulcanize/templates/nginx/config/rubber/role/web/nginx.conf +133 -0
  101. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/index.html +23 -0
  102. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/nginx-tools.conf +74 -0
  103. data/generators/vulcanize/templates/nginx/config/rubber/rubber-nginx.yml +33 -0
  104. data/generators/vulcanize/templates/nginx/templates.yml +1 -0
  105. data/generators/vulcanize/templates/passenger/config/rubber/deploy-passenger.rb +27 -0
  106. data/generators/vulcanize/templates/passenger/config/rubber/role/web/passenger.conf +8 -0
  107. data/generators/vulcanize/templates/passenger/config/rubber/rubber-passenger.yml +4 -0
  108. data/generators/vulcanize/templates/passenger/templates.yml +1 -0
  109. data/generators/vulcanize/templates/sphinx/config/rubber/common/sphinx.yml +46 -0
  110. data/generators/vulcanize/templates/sphinx/config/rubber/deploy-sphinx.rb +112 -0
  111. data/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/crontab +11 -0
  112. data/generators/vulcanize/templates/sphinx/config/rubber/role/sphinx/monit-sphinx.conf +10 -0
  113. data/generators/vulcanize/templates/sphinx/config/rubber/rubber-sphinx.yml +6 -0
  114. data/generators/vulcanize/templates/sphinx/templates.yml +1 -0
  115. data/generators/vulcanize/vulcanize_generator.rb +67 -0
  116. data/lib/capistrano/hostcmd.rb +12 -0
  117. data/lib/rubber.rb +37 -0
  118. data/lib/rubber/capistrano.rb +1 -0
  119. data/lib/rubber/cloud.rb +13 -0
  120. data/lib/rubber/cloud/aws.rb +261 -0
  121. data/lib/rubber/cloud/base.rb +16 -0
  122. data/lib/rubber/configuration.rb +47 -0
  123. data/lib/rubber/dns.rb +13 -0
  124. data/lib/rubber/dns/base.rb +69 -0
  125. data/lib/rubber/dns/dyndns.rb +63 -0
  126. data/lib/rubber/dns/nettica.rb +56 -0
  127. data/lib/rubber/dns/zerigo.rb +121 -0
  128. data/lib/rubber/environment.rb +161 -0
  129. data/lib/rubber/generator.rb +197 -0
  130. data/lib/rubber/instance.rb +113 -0
  131. data/lib/rubber/recipes/rubber.rb +88 -0
  132. data/lib/rubber/recipes/rubber/bundles.rb +28 -0
  133. data/lib/rubber/recipes/rubber/deploy.rb +66 -0
  134. data/lib/rubber/recipes/rubber/instances.rb +298 -0
  135. data/lib/rubber/recipes/rubber/security_groups.rb +149 -0
  136. data/lib/rubber/recipes/rubber/setup.rb +285 -0
  137. data/lib/rubber/recipes/rubber/static_ips.rb +107 -0
  138. data/lib/rubber/recipes/rubber/utils.rb +195 -0
  139. data/lib/rubber/recipes/rubber/volumes.rb +263 -0
  140. data/lib/rubber/tasks/rubber.rb +218 -0
  141. data/lib/rubber/util.rb +33 -0
  142. data/test/environment_test.rb +118 -0
  143. data/test/generator_test.rb +323 -0
  144. data/test/instance_test.rb +38 -0
  145. data/test/test_helper.rb +4 -0
  146. data/test/util_test.rb +16 -0
  147. metadata +246 -0
@@ -0,0 +1,11 @@
1
+ <%
2
+ @read_cmd = 'crontab -l'
3
+ @write_cmd = 'crontab -'
4
+ @additive = ["# rubber-sphinx-start", "# rubber-sphinx-end"]
5
+ %>
6
+
7
+ # incremental index once every 10 minutes
8
+ */10 * * * * sudo -u rails <%= RUBBER_ROOT %>/script/cron-rake RUBBER_ENV=<%= RUBBER_ENV %> ts:in:delta
9
+
10
+ # full reindex daily at 4:35
11
+ 35 4 * * * sudo -u rails <%= RUBBER_ROOT %>/script/cron-rake RUBBER_ENV=<%= RUBBER_ENV %> ts:index
@@ -0,0 +1,10 @@
1
+ <%
2
+ @path = '/etc/monit/monit.d/monit-sphinx.conf'
3
+ %>
4
+
5
+ check process sphinx with pidfile <%= RUBBER_ROOT %>/log/searchd.<%= RUBBER_ENV %>.pid
6
+ group sphinx-<%= RUBBER_ENV %>
7
+ start program = "/usr/bin/sudo -u rails sh -c 'cd <%= RUBBER_ROOT %> && PATH=/usr/local/bin:$PATH RAILS_ENV=<%= RUBBER_ENV %> rake ts:start'"
8
+ stop program = "/usr/bin/sudo -u rails sh -c 'cd <%= RUBBER_ROOT %> && PATH=/usr/local/bin:$PATH RAILS_ENV=<%= RUBBER_ENV %> rake ts:stop'"
9
+ if failed host <%= rubber_env.host %> port 3312 with timeout 5 seconds for 5 cycles then restart
10
+
@@ -0,0 +1,6 @@
1
+ gems: []
2
+
3
+ roles:
4
+ sphinx:
5
+ packages: [bzr-builddeb, autotools-dev, dpatch, libpq-dev, autoconf,
6
+ libtool, automake, gawk, libmysqlclient15-dev]
@@ -0,0 +1 @@
1
+ description: The sphinx searchd / thinking sphinx module
@@ -0,0 +1,67 @@
1
+ require 'fileutils'
2
+ require 'find'
3
+
4
+ class VulcanizeGenerator < Rails::Generator::NamedBase
5
+
6
+ TEMPLATE_ROOT = File.dirname(__FILE__) + "/templates"
7
+ TEMPLATE_FILE = "templates.yml"
8
+
9
+ def manifest
10
+ record do |m|
11
+ templates = [file_name] + actions
12
+ templates.each do |t|
13
+ apply_template(m, t)
14
+ end
15
+ end
16
+ end
17
+
18
+ def apply_template(m, name)
19
+ sp = source_path("#{name}/")
20
+ unless File.directory?(sp)
21
+ raise Rails::Generator::UsageError.new("Invalid template #{name}, use one of #{valid_templates.join(', ')}")
22
+ end
23
+
24
+ templ_conf = load_template_config(sp)
25
+ deps = templ_conf['dependent_templates'] || []
26
+ deps.each do |dep|
27
+ apply_template(m, dep)
28
+ end
29
+
30
+ Find.find(sp) do |f|
31
+ Find.prune if File.basename(f) =~ /^(CVS|\.svn)$/
32
+ Find.prune if f == "#{sp}#{TEMPLATE_FILE}"
33
+
34
+ rel = f.gsub(/#{source_root}\//, '')
35
+ dest_rel = rel.gsub(/^#{name}\//, '')
36
+ m.directory(dest_rel) if File.directory?(f)
37
+ if File.file?(f)
38
+ # force scripts to be executable
39
+ opts = (File.read(f) =~ /^#!/) ? {:chmod => 0755} : {}
40
+ m.file(rel, dest_rel, opts)
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ protected
47
+ def valid_templates
48
+ valid = Dir.entries(TEMPLATE_ROOT).delete_if {|e| e =~ /(^\.)|svn|CVS/ }
49
+ end
50
+
51
+ def load_template_config(template_dir)
52
+ templ_file = "#{template_dir}/templates.yml"
53
+ templ_conf = YAML.load(File.read(templ_file)) rescue {}
54
+ return templ_conf
55
+ end
56
+
57
+ def banner
58
+ usage = "Usage: #{$0} vulcanize template_name ...\n"
59
+ usage << "where template_name is one of:\n\n"
60
+ valid_templates.each do |t|
61
+ templ_conf = load_template_config("#{TEMPLATE_ROOT}/#{t}")
62
+ desc = templ_conf['description']
63
+ usage << " #{t}: #{desc}\n"
64
+ end
65
+ return usage
66
+ end
67
+ end
@@ -0,0 +1,12 @@
1
+ require 'capistrano/command'
2
+
3
+ # capistrano hack to allow us to run slightly different commands on multiple
4
+ # hosts in parallel
5
+ module Capistrano
6
+ class Command
7
+ def replace_placeholders(command, channel)
8
+ command = command.gsub(/\$CAPISTRANO:HOST\$/, channel[:host])
9
+ command.gsub(/\$CAPISTRANO:VAR\$/, @options["hostvar_#{channel[:host]}"].to_s)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,37 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ module Rubber
4
+
5
+ def self.initialize(project_root, project_env)
6
+ return if defined?(RUBBER_ROOT) && defined?(RUBBER_ENV)
7
+
8
+ Object.const_set('RUBBER_ENV', project_env)
9
+ Object.const_set('RUBBER_ROOT', project_root)
10
+
11
+ # pull in basic rails env. rubber only needs RAILS_ROOT and RAILS_ENV.
12
+ # We actually do NOT want the entire rails environment because it
13
+ # complicates bootstrap (i.e. can't run config to create db because full
14
+ # rails env needs db to exist as some plugin accesses model or something)
15
+ rails_boot_file = File.join(RUBBER_ROOT, 'config', 'boot')
16
+ require(rails_boot_file) if File.exists? rails_boot_file
17
+
18
+ if defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER
19
+ Object.const_set('LOGGER', RAILS_DEFAULT_LOGGER)
20
+ else
21
+ Object.const_set('LOGGER', Logger.new($stdout))
22
+ LOGGER.level = Logger::INFO
23
+ LOGGER.formatter = lambda {|severity, time, progname, msg| "Rubber[%s]: %s\n" % [severity, msg.to_s.lstrip]}
24
+ end
25
+ end
26
+
27
+ VERSION = File.read(File.join(File.dirname(__FILE__), '..', 'VERSION')).chomp
28
+ end
29
+
30
+
31
+ require 'rubber/configuration'
32
+ require 'rubber/environment'
33
+ require 'rubber/generator'
34
+ require 'rubber/instance'
35
+ require 'rubber/util'
36
+ require 'rubber/cloud'
37
+ require 'rubber/dns'
@@ -0,0 +1 @@
1
+ Capistrano::Configuration.instance.load(File.join(File.dirname(__FILE__), 'recipes', 'rubber.rb'))
@@ -0,0 +1,13 @@
1
+ require "rubber/cloud/base"
2
+
3
+ module Rubber
4
+ module Cloud
5
+
6
+ def self.get_provider(provider, env, capistrano)
7
+ require "rubber/cloud/#{provider}"
8
+ clazz = Rubber::Cloud.const_get(provider.capitalize)
9
+ return clazz.new(env, capistrano)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,261 @@
1
+ require 'rubygems'
2
+ require 'EC2'
3
+ require 'aws/s3'
4
+
5
+ module Rubber
6
+ module Cloud
7
+
8
+ class Aws < Base
9
+
10
+ def initialize(env, capistrano)
11
+ super(env, capistrano)
12
+ @aws_env = env.cloud_providers.aws
13
+ @ec2 = EC2::Base.new(:access_key_id => @aws_env.access_key, :secret_access_key => @aws_env.secret_access_key)
14
+ AWS::S3::Base.establish_connection!(:access_key_id => @aws_env.access_key, :secret_access_key => @aws_env.secret_access_key)
15
+ end
16
+
17
+
18
+ def create_instance(ami, ami_type, security_groups, availability_zone)
19
+ response = @ec2.run_instances(:image_id => ami, :key_name => @aws_env.key_name, :instance_type => ami_type, :group_id => security_groups, :availability_zone => availability_zone)
20
+ instance_id = response.instancesSet.item[0].instanceId
21
+ return instance_id
22
+ end
23
+
24
+ def describe_instances(instance_id=nil)
25
+ instances = []
26
+
27
+ response = @ec2.describe_instances(:instance_id => instance_id)
28
+ response.reservationSet.item.each do |ritem|
29
+ ritem.instancesSet.item.each do |item|
30
+ instance = {}
31
+ instance[:id] = item.instanceId
32
+ instance[:external_host] = item.dnsName
33
+ instance[:external_ip] = IPSocket.getaddress(instance[:external_host]) rescue nil
34
+ instance[:internal_host] = item.privateDnsName
35
+ instance[:state] = item.instanceState.name
36
+ instance[:zone] = item.placement.availabilityZone
37
+ instances << instance
38
+ end
39
+ end if response.reservationSet
40
+
41
+ return instances
42
+ end
43
+
44
+ def destroy_instance(instance_id)
45
+ response = @ec2.terminate_instances(:instance_id => instance_id)
46
+ end
47
+
48
+ def describe_availability_zones
49
+ zones = []
50
+ response = @ec2.describe_availability_zones()
51
+ response.availabilityZoneInfo.item.each do |item|
52
+ zone = {}
53
+ zone[:name] = item.zoneName
54
+ zone[:state] =item.zoneState
55
+ zones << zone
56
+ end if response.availabilityZoneInfo
57
+ return zones
58
+ end
59
+
60
+ def create_security_group(group_name, group_description)
61
+ @ec2.create_security_group(:group_name => group_name, :group_description => group_description)
62
+ end
63
+
64
+ def describe_security_groups(group_name=nil)
65
+ groups = []
66
+
67
+ opts = {}
68
+ opts[:group_name] = group_name if group_name
69
+ response = @ec2.describe_security_groups(opts)
70
+
71
+ response.securityGroupInfo.item.each do |item|
72
+ group = {}
73
+ group[:name] = item.groupName
74
+ group[:description] = item.groupDescription
75
+
76
+ item.ipPermissions.item.each do |ip_item|
77
+ group[:permissions] ||= []
78
+ rule = {}
79
+
80
+ rule[:protocol] = ip_item.ipProtocol
81
+ rule[:from_port] = ip_item.fromPort
82
+ rule[:to_port] = ip_item.toPort
83
+
84
+ ip_item.groups.item.each do |rule_group|
85
+ rule[:source_groups] ||= []
86
+ source_group = {}
87
+ source_group[:account] = rule_group.userId
88
+ source_group[:name] = rule_group.groupName
89
+ rule[:source_groups] << source_group
90
+ end if ip_item.groups
91
+
92
+ ip_item.ipRanges.item.each do |ip_range|
93
+ rule[:source_ips] ||= []
94
+ rule[:source_ips] << ip_range.cidrIp
95
+ end if ip_item.ipRanges
96
+
97
+ group[:permissions] << rule
98
+ end if item.ipPermissions
99
+
100
+ groups << group
101
+
102
+ end if response.securityGroupInfo
103
+
104
+ return groups
105
+ end
106
+
107
+ def add_security_group_rule(group_name, protocol, from_port, to_port, source)
108
+ opts = {:group_name => group_name}
109
+ if source.instance_of? Hash
110
+ opts = opts.merge(:source_security_group_name => source[:name], :source_security_group_owner_id => source[:account])
111
+ else
112
+ opts = opts.merge(:ip_protocol => protocol, :from_port => from_port, :to_port => to_port, :cidr_ip => source)
113
+ end
114
+ @ec2.authorize_security_group_ingress(opts)
115
+ end
116
+
117
+ def remove_security_group_rule(group_name, protocol, from_port, to_port, source)
118
+ opts = {:group_name => group_name}
119
+ if source.instance_of? Hash
120
+ opts = opts.merge(:source_security_group_name => source[:name], :source_security_group_owner_id => source[:account])
121
+ else
122
+ opts = opts.merge(:ip_protocol => protocol, :from_port => from_port, :to_port => to_port, :cidr_ip => source)
123
+ end
124
+ @ec2.revoke_security_group_ingress(opts)
125
+ end
126
+
127
+ def destroy_security_group(group_name)
128
+ @ec2.delete_security_group(:group_name => group_name)
129
+ end
130
+
131
+ def create_static_ip
132
+ response = @ec2.allocate_address()
133
+ return response.publicIp
134
+ end
135
+
136
+ def attach_static_ip(ip, instance_id)
137
+ response = @ec2.associate_address(:instance_id => instance_id, :public_ip => ip)
138
+ return response.return == "true"
139
+ end
140
+
141
+ def detach_static_ip(ip)
142
+ response = @ec2.disassociate_address(:public_ip => ip)
143
+ return response.return == "true"
144
+ end
145
+
146
+ def describe_static_ips(ip=nil)
147
+ ips = []
148
+ response = @ec2.describe_addresses()
149
+ response.addressesSet.item.each do |item|
150
+ ip = {}
151
+ ip[:instance_id] = item.instanceId
152
+ ip[:ip] = item.publicIp
153
+ ips << ip
154
+ end if response.addressesSet
155
+ return ips
156
+ end
157
+
158
+ def destroy_static_ip(ip)
159
+ response = @ec2.release_address(:public_ip => ip)
160
+ return response.return == "true"
161
+ end
162
+
163
+ def create_volume(size, zone)
164
+ response = @ec2.create_volume(:size => size.to_s, :availability_zone => zone)
165
+ return response.volumeId
166
+ end
167
+
168
+ def attach_volume(volume_id, instance_id, device)
169
+ response = @ec2.attach_volume(:volume_id => volume_id, :instance_id => instance_id, :device => device)
170
+ return response.status
171
+ end
172
+
173
+ def detach_volume(volume_id)
174
+ @ec2.detach_volume(:volume_id => volume_id, :force => 'true')
175
+ end
176
+
177
+ def describe_volumes(volume_id=nil)
178
+ volumes = []
179
+ opts = {}
180
+ opts[:volume_id] = volume_id if volume_id
181
+ response = @ec2.describe_volumes(opts)
182
+ response.volumeSet.item.each do |item|
183
+ volume = {}
184
+ volume[:id] = item.volumeId
185
+ volume[:status] = item.status
186
+ if attach = item.attachmentSet.item[0]
187
+ volume[:attachment_instance_id] = attach.instanceId
188
+ volume[:attachment_status] = attach.status
189
+ end
190
+ volumes << volume
191
+ end if response.volumeSet
192
+ return volumes
193
+ end
194
+
195
+ def destroy_volume(volume_id)
196
+ @ec2.delete_volume(:volume_id => volume_id)
197
+ end
198
+
199
+ def create_image(image_name)
200
+ ec2_key = @aws_env.key_file
201
+ ec2_pk = @aws_env.pk_file
202
+ ec2_cert = @aws_env.cert_file
203
+ aws_account = @aws_env.account
204
+ ec2_key_dest = "/mnt/#{File.basename(ec2_key)}"
205
+ ec2_pk_dest = "/mnt/#{File.basename(ec2_pk)}"
206
+ ec2_cert_dest = "/mnt/#{File.basename(ec2_cert)}"
207
+
208
+ capistrano.put(File.read(ec2_key), ec2_key_dest)
209
+ capistrano.put(File.read(ec2_pk), ec2_pk_dest)
210
+ capistrano.put(File.read(ec2_cert), ec2_cert_dest)
211
+
212
+ arch = capistrano.capture "uname -m"
213
+ arch = case arch when /i\d86/ then "i386" else arch end
214
+ capistrano.sudo_script "create_bundle", <<-CMD
215
+ export RUBYLIB=/usr/lib/site_ruby/
216
+ ec2-bundle-vol --batch -d /mnt -k #{ec2_pk_dest} -c #{ec2_cert_dest} -u #{account} -p #{image_name} -r #{arch}
217
+ CMD
218
+
219
+ capistrano.sudo_script "register_bundle", <<-CMD
220
+ export RUBYLIB=/usr/lib/site_ruby/
221
+ ec2-upload-bundle --batch -b #{@aws_env.image_bucket} -m /mnt/#{image_name}.manifest.xml -a #{@aws_env.access_key} -s #{@aws_env.secret_access_key}
222
+ CMD
223
+
224
+ image_location = "#{@aws_env.image_bucket}/#{image_name}.manifest.xml"
225
+ response = @ec2.register_image(:image_location => image_location)
226
+ return response.imageId
227
+ end
228
+
229
+ def describe_images(image_id=nil)
230
+ images = []
231
+ response = @ec2.describe_images(:owner_id => 'self', :image_id => image_id)
232
+ response.imagesSet.item.each do |item|
233
+ image = {}
234
+ image[:id] = item.imageId
235
+ image[:location] = item.imageLocation
236
+ images << image
237
+ end if response.imagesSet
238
+ return images
239
+ end
240
+
241
+ def destroy_image(image_id)
242
+ image = describe_images(image_id).first
243
+ image_location = image[:location]
244
+ bucket = image_location.split('/').first
245
+ image_name = image_location.split('/').last.gsub(/\.manifest\.xml$/, '')
246
+
247
+ @ec2.deregister_image(:image_id => image_id)
248
+
249
+ s3_bucket = AWS::S3::Bucket.find(bucket)
250
+ s3_bucket.objects(:prefix => image_name).clone.each do |obj|
251
+ obj.delete
252
+ end
253
+ if s3_bucket.empty?
254
+ s3_bucket.delete
255
+ end
256
+ end
257
+
258
+ end
259
+
260
+ end
261
+ end
@@ -0,0 +1,16 @@
1
+ module Rubber
2
+ module Cloud
3
+
4
+ class Base
5
+
6
+ attr_reader :env, :capistrano
7
+
8
+ def initialize(env, capistrano)
9
+ @env = env
10
+ @capistrano = capistrano
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+ end