dnapi 1.1.74.jruby192.c
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/lib/dnapi.rb +54 -0
- data/lib/dnapi/app.rb +130 -0
- data/lib/dnapi/component.rb +50 -0
- data/lib/dnapi/component_possessor.rb +49 -0
- data/lib/dnapi/components/addons.rb +26 -0
- data/lib/dnapi/components/apache.rb +13 -0
- data/lib/dnapi/components/cloudkick.rb +13 -0
- data/lib/dnapi/components/encrypted_backup.rb +12 -0
- data/lib/dnapi/components/exim.rb +10 -0
- data/lib/dnapi/components/monitor.rb +12 -0
- data/lib/dnapi/components/nagios.rb +28 -0
- data/lib/dnapi/components/newrelic.rb +12 -0
- data/lib/dnapi/components/passenger3.rb +13 -0
- data/lib/dnapi/components/ruby.rb +234 -0
- data/lib/dnapi/components/ssmtp.rb +10 -0
- data/lib/dnapi/components/stunneled.rb +13 -0
- data/lib/dnapi/components/volume.rb +32 -0
- data/lib/dnapi/cron.rb +5 -0
- data/lib/dnapi/db_stack.rb +92 -0
- data/lib/dnapi/ebuild_dep.rb +5 -0
- data/lib/dnapi/environment.rb +327 -0
- data/lib/dnapi/extensions.rb +32 -0
- data/lib/dnapi/gem_dep.rb +9 -0
- data/lib/dnapi/instance.rb +69 -0
- data/lib/dnapi/monitoring.rb +22 -0
- data/lib/dnapi/recipe.rb +27 -0
- data/lib/dnapi/ssl_cert.rb +13 -0
- data/lib/dnapi/stack.rb +111 -0
- data/lib/dnapi/struct.rb +149 -0
- data/lib/dnapi/test.rb +114 -0
- data/lib/dnapi/test/ext.rb +32 -0
- data/lib/dnapi/test/sweatshop.rb +148 -0
- data/lib/dnapi/version.rb +3 -0
- data/lib/dnapi/vhost.rb +24 -0
- data/spec/app_spec.rb +68 -0
- data/spec/component_spec.rb +66 -0
- data/spec/components/addons_spec.rb +33 -0
- data/spec/components/cloudkick_spec.rb +17 -0
- data/spec/components/nagios_spec.rb +42 -0
- data/spec/components/nodejs_spec.rb +27 -0
- data/spec/components/passenger3_spec.rb +12 -0
- data/spec/components/ruby_spec.rb +321 -0
- data/spec/components/stunneled.rb +15 -0
- data/spec/components/volume_spec.rb +21 -0
- data/spec/db_stack_spec.rb +111 -0
- data/spec/environment_spec.rb +227 -0
- data/spec/instance_spec.rb +52 -0
- data/spec/proxies.rb +143 -0
- data/spec/proxies_spec.rb +76 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/stack_spec.rb +105 -0
- data/spec/struct_spec.rb +100 -0
- metadata +181 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
class Array
|
2
|
+
def to_jexp
|
3
|
+
map {|v| JSON.jexp(v) }
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Hash
|
8
|
+
def to_jexp
|
9
|
+
inject(self::class.new) do |h, (key, value)|
|
10
|
+
h.update key.to_s => JSON.jexp(value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Integer
|
16
|
+
def to_jexp() self end
|
17
|
+
end
|
18
|
+
|
19
|
+
module JSON
|
20
|
+
def self.jexp(*a)
|
21
|
+
if a.size == 1 && RUBY_VERSION >= "1.9.0"
|
22
|
+
o = a.first
|
23
|
+
o.respond_to?(:to_jexp) ? o.to_jexp : JSON.parse(JSON.dump([o])).first
|
24
|
+
else
|
25
|
+
return *a.map{|o| o.respond_to?(:to_jexp) ? o.to_jexp : JSON.parse(JSON.dump([o])).first}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class String
|
31
|
+
def to_jexp() self end
|
32
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module DNApi
|
2
|
+
class Instance < Struct.new(
|
3
|
+
:id,
|
4
|
+
:name,
|
5
|
+
:reporting_url,
|
6
|
+
:role,
|
7
|
+
:enabled,
|
8
|
+
:public_hostname,
|
9
|
+
:private_hostname,
|
10
|
+
:awsm_token,
|
11
|
+
:stonith_config,
|
12
|
+
:instance_api_config)
|
13
|
+
|
14
|
+
include ComponentPossessor
|
15
|
+
|
16
|
+
component_group :volumes, :ephemeral_volume, :ebs_volume
|
17
|
+
|
18
|
+
attr_accessor :environment
|
19
|
+
|
20
|
+
def initialize(attributes)
|
21
|
+
#legacy - (awsm,cookbooks?) passed in 'provisioned' (<2010?) - paranoid of breaking our existing "api"
|
22
|
+
if provisioned = attributes.delete(:provisioned)
|
23
|
+
attributes[:id] = provisioned.id
|
24
|
+
attributes[:public_hostname] = provisioned.public_hostname
|
25
|
+
attributes[:private_hostname] = provisioned.private_hostname
|
26
|
+
end
|
27
|
+
super(attributes)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :enabled?, :enabled
|
31
|
+
|
32
|
+
def newrelic_seed
|
33
|
+
c = component(:newrelic)
|
34
|
+
c && c.seed
|
35
|
+
end
|
36
|
+
|
37
|
+
def newrelic_token
|
38
|
+
c = component(:newrelic)
|
39
|
+
c && c.token
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_legacy_hash
|
43
|
+
environment.to_legacy_hash.merge(legacy_hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
def engineyard_hash
|
47
|
+
{ :environment => environment.to_hash,
|
48
|
+
:this => id }
|
49
|
+
end
|
50
|
+
|
51
|
+
def legacy_hash
|
52
|
+
{ :engineyard => engineyard_hash,
|
53
|
+
:instance_role => role,
|
54
|
+
:reporting_url => reporting_url,
|
55
|
+
:name => name }.reject {|k,v| v.nil? }
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_dna
|
59
|
+
to_legacy_hash
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_s
|
63
|
+
"Instance #{id} @ #{public_hostname} as #{role}"
|
64
|
+
end
|
65
|
+
|
66
|
+
## chef-ey selectors
|
67
|
+
def_delegators :environment, :apps, :recipes, :solo?, :ssh_username, :ssh_password
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module DNApi
|
2
|
+
class Monitoring < Struct.new(:name, :label)
|
3
|
+
Monit = new(:name => "monit", :label => "Monit")
|
4
|
+
God = new(:name => "god", :label => "god")
|
5
|
+
|
6
|
+
def self.all
|
7
|
+
@all ||= [Monit, God]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.get(name)
|
11
|
+
all.detect { |m| m.name == name }
|
12
|
+
end
|
13
|
+
|
14
|
+
def monit?
|
15
|
+
name == "monit"
|
16
|
+
end
|
17
|
+
|
18
|
+
def god?
|
19
|
+
name == "god"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/dnapi/recipe.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module DNApi
|
2
|
+
class Recipe < Struct.new(:name)
|
3
|
+
Monit = new(:name => 'monit')
|
4
|
+
Memcached = new(:name => 'memcached')
|
5
|
+
Nginx = new(:name => 'nginx')
|
6
|
+
NginxPassenger = new(:name => 'nginx-passenger')
|
7
|
+
Passenger = new(:name => 'passenger')
|
8
|
+
ApachePassenger = new(:name => 'passenger::apache')
|
9
|
+
Mongrel = new(:name => 'mongrel')
|
10
|
+
Unicorn = new(:name => 'unicorn')
|
11
|
+
Mysql51 = new(:name => 'mysql5_1')
|
12
|
+
Mysql55 = new(:name => 'mysql5_5')
|
13
|
+
Nginxtcp = new(:name => 'nginxtcp')
|
14
|
+
Node = new(:name => 'node::component')
|
15
|
+
Trinidad = new(:name => 'trinidad')
|
16
|
+
Thin = new(:name => 'thin')
|
17
|
+
|
18
|
+
def self.defaults
|
19
|
+
[Memcached, Monit]
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.all
|
23
|
+
[Monit, Memcached, Nginx, NginxPassenger, ApachePassenger,
|
24
|
+
Mongrel, Unicorn, Mysql51, Mysql55, Nginxtcp, Node, Trinidad,Thin]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/dnapi/stack.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
module DNApi
|
2
|
+
class Stack < Struct.new(:name, :label, :web_server, :rack_server, :ruby_versions, :recipes)
|
3
|
+
|
4
|
+
def initialize(opts = {})
|
5
|
+
super(opts)
|
6
|
+
end
|
7
|
+
|
8
|
+
NginxMongrel = new(:name => 'nginx_mongrel',
|
9
|
+
:label => 'Mongrel',
|
10
|
+
:web_server => :nginx,
|
11
|
+
:rack_server => :mongrel,
|
12
|
+
:ruby_versions => (DNApi::Components::RubyVersion.all - [DNApi::Components::Ruby193,
|
13
|
+
DNApi::Components::Ruby192,
|
14
|
+
DNApi::Components::JRuby187,
|
15
|
+
DNApi::Components::JRuby192,
|
16
|
+
DNApi::Components::Rubinius]),
|
17
|
+
:recipes => [Recipe::Nginx, Recipe::Mongrel])
|
18
|
+
|
19
|
+
NginxPassenger = new(:name => 'nginx_passenger',
|
20
|
+
:label => 'Passenger',
|
21
|
+
:web_server => :nginx,
|
22
|
+
:rack_server => :passenger,
|
23
|
+
:ruby_versions => (DNApi::Components::RubyVersion.all - [DNApi::Components::JRuby187,
|
24
|
+
DNApi::Components::JRuby192,
|
25
|
+
DNApi::Components::Rubinius]),
|
26
|
+
:recipes => [Recipe::Nginx, Recipe::NginxPassenger])
|
27
|
+
|
28
|
+
NginxPassenger3 = new(:name => 'nginx_passenger3',
|
29
|
+
:label => 'Passenger 3',
|
30
|
+
:web_server => :nginx,
|
31
|
+
:rack_server => :passenger,
|
32
|
+
:ruby_versions => (DNApi::Components::RubyVersion.all - [DNApi::Components::JRuby187,
|
33
|
+
DNApi::Components::JRuby192,
|
34
|
+
DNApi::Components::Ruby186]),
|
35
|
+
:recipes => [Recipe::Nginx, Recipe::NginxPassenger])
|
36
|
+
|
37
|
+
#FIXME: Remove
|
38
|
+
ApachePassenger = new(:name => 'apache_passenger',
|
39
|
+
:label => 'Apache + Passenger',
|
40
|
+
:web_server => :apache,
|
41
|
+
:rack_server => :passenger,
|
42
|
+
:ruby_versions => [DNApi::Components::Ruby186],
|
43
|
+
:recipes => [Recipe::Passenger, Recipe::ApachePassenger])
|
44
|
+
|
45
|
+
NginxUnicorn = new(:name => 'nginx_unicorn',
|
46
|
+
:label => 'Unicorn',
|
47
|
+
:web_server => :nginx,
|
48
|
+
:rack_server => :unicorn,
|
49
|
+
:ruby_versions => (DNApi::Components::RubyVersion.all - [DNApi::Components::JRuby187,
|
50
|
+
DNApi::Components::JRuby192,
|
51
|
+
DNApi::Components::Rubinius]),
|
52
|
+
:recipes => [Recipe::Nginx, Recipe::Unicorn])
|
53
|
+
|
54
|
+
Trinidad = new(:name => 'trinidad',
|
55
|
+
:label => 'Trinidad',
|
56
|
+
:web_server => :nginx,
|
57
|
+
:rack_server => :trinidad,
|
58
|
+
:ruby_versions => [DNApi::Components::JRuby187, DNApi::Components::JRuby192],
|
59
|
+
:recipes => [Recipe::Nginx, Recipe::Trinidad])
|
60
|
+
|
61
|
+
Nginxtcp = new(:name => 'nginxtcp',
|
62
|
+
:label => 'NodeJS',
|
63
|
+
:web_server => :nginxtcp,
|
64
|
+
:rack_server => :nodejs,
|
65
|
+
:ruby_versions => [DNApi::Components::NodeJS],
|
66
|
+
:recipes => [Recipe::Nginxtcp, Recipe::Node])
|
67
|
+
|
68
|
+
NginxThin = new(:name => 'thin',
|
69
|
+
:label => 'Thin',
|
70
|
+
:web_server => :nginx,
|
71
|
+
:rack_server => :thin,
|
72
|
+
:ruby_versions => (DNApi::Components::RubyVersion.all - [DNApi::Components::JRuby187,
|
73
|
+
DNApi::Components::JRuby192,
|
74
|
+
DNApi::Components::Rubinius]),
|
75
|
+
:recipes => [Recipe::Nginx, Recipe::Thin])
|
76
|
+
|
77
|
+
def self.all
|
78
|
+
[NginxMongrel, NginxPassenger, NginxPassenger3, ApachePassenger, NginxUnicorn, Trinidad, Nginxtcp,NginxThin]
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.get(name)
|
82
|
+
all.detect {|s| s.name == name }
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# Legacy helper methods to inspect the stack.
|
87
|
+
#
|
88
|
+
# We should tend to not use them and install specific recipes for each stack rather than
|
89
|
+
# check this to run code inside more global recipes.
|
90
|
+
#
|
91
|
+
# DO NOT DO THIS:
|
92
|
+
# i.e: The nginx recipe checks whether the stack uses nginx.
|
93
|
+
# i.e 2: The nginx recipe installs passenger if the stack uses passenger if the middle of the nginx installation.
|
94
|
+
#
|
95
|
+
# DO THIS:
|
96
|
+
# i.e: The nginx recipe is only loaded for stacks that use nginx.
|
97
|
+
# i.e 2: The stack that needs nginx+passenger loads the nginx recipe and after that loads the passenger recipe for nginx.
|
98
|
+
#
|
99
|
+
[:nginx, :apache].each do |ws|
|
100
|
+
define_method :"#{ws}?" do
|
101
|
+
self.web_server == ws
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
[:passenger, :mongrel, :unicorn, :trinidad, :thin].each do |as|
|
106
|
+
define_method :"#{as}?" do
|
107
|
+
self.rack_server == as
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/dnapi/struct.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
module DNApi
|
2
|
+
class Struct < ::Struct
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
class_inheritable_accessor :_many, :_ones, :_umembers
|
6
|
+
|
7
|
+
def_delegator :to_hash, :to_jexp
|
8
|
+
def_delegator :to_jexp, :to_json
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def _many() @_many ||= [] end
|
12
|
+
def _ones() @_ones ||= [] end
|
13
|
+
def _umembers() @_umembers ||= [] end
|
14
|
+
end
|
15
|
+
attr_accessor :parent
|
16
|
+
|
17
|
+
def self.map
|
18
|
+
{
|
19
|
+
:instances => DNApi::Instance,
|
20
|
+
:apps => DNApi::App,
|
21
|
+
:crons => DNApi::Cron,
|
22
|
+
:gems => DNApi::GemDep,
|
23
|
+
:ebuilds => DNApi::EbuildDep,
|
24
|
+
:ssl_cert => DNApi::SSLCert,
|
25
|
+
:vhosts => DNApi::VHost,
|
26
|
+
:components => DNApi::Component,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.from(jexp)
|
31
|
+
_many.each do |assoc|
|
32
|
+
jexp[assoc.to_s] = jexp[assoc.to_s].map do |item|
|
33
|
+
if klass = map[assoc.to_sym]
|
34
|
+
klass.from(item)
|
35
|
+
else
|
36
|
+
raise "No class found for #{assoc.inspect}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
_ones.each do |assoc|
|
42
|
+
if jexp[assoc.to_s]
|
43
|
+
jexp[assoc.to_s] = begin
|
44
|
+
item = jexp[assoc.to_s]
|
45
|
+
if klass = map[assoc.to_sym]
|
46
|
+
klass.from(item)
|
47
|
+
else
|
48
|
+
raise "No class found for #{assoc.inspect}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
new(jexp)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.many(*names)
|
57
|
+
_many.push(*names)
|
58
|
+
attr_reader(*names)
|
59
|
+
names.each do |name|
|
60
|
+
class_eval <<-EOT, __FILE__, __LINE__ + 1
|
61
|
+
def #{name}=(values)
|
62
|
+
values.each do |value|
|
63
|
+
value.parent = self if value.is_a?(DNApi::Struct)
|
64
|
+
end
|
65
|
+
@#{name} = values
|
66
|
+
end
|
67
|
+
EOT
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.one(*names)
|
72
|
+
_ones.push(*names)
|
73
|
+
attr_reader(*names)
|
74
|
+
names.each do |name|
|
75
|
+
class_eval <<-EOT, __FILE__, __LINE__ + 1
|
76
|
+
def #{name}=(value)
|
77
|
+
value.parent = self if value.is_a?(DNApi::Struct)
|
78
|
+
@#{name} = value
|
79
|
+
end
|
80
|
+
EOT
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.belongs_to(name)
|
85
|
+
alias_method name, :parent
|
86
|
+
alias_method "#{name}=", :parent=
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.unserialized_member(*names)
|
90
|
+
_umembers.push(*names)
|
91
|
+
attr_accessor(*names)
|
92
|
+
end
|
93
|
+
|
94
|
+
def initialize(attrs = {})
|
95
|
+
raise(ArgumentError, "#{attrs.inspect} is not a hash") unless attrs.is_a?(Hash)
|
96
|
+
|
97
|
+
mattrs = attrs.to_mash
|
98
|
+
super(*members.map {|m| mattrs.delete(m) })
|
99
|
+
|
100
|
+
self::class._many.each do |assoc|
|
101
|
+
send(:"#{assoc}=", mattrs.delete(assoc) || [])
|
102
|
+
end
|
103
|
+
|
104
|
+
self::class._ones.each do |assoc|
|
105
|
+
send(:"#{assoc}=", mattrs.delete(assoc) || nil)
|
106
|
+
end
|
107
|
+
|
108
|
+
mattrs.each do |key, value|
|
109
|
+
send("#{key}=", value)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def _many
|
114
|
+
self.class._many
|
115
|
+
end
|
116
|
+
|
117
|
+
def _ones
|
118
|
+
self.class._ones
|
119
|
+
end
|
120
|
+
|
121
|
+
def _many_values
|
122
|
+
_many.map {|assoc| send(assoc)}
|
123
|
+
end
|
124
|
+
|
125
|
+
def _ones_values
|
126
|
+
_ones.map {|assoc| send(assoc)}
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_hash
|
130
|
+
data = members.zip(values)
|
131
|
+
association_data = _many.zip(_many_values) + _ones.zip(_ones_values)
|
132
|
+
(data + association_data).inject({}) {|h,(k,v)| h.update(k => v) } #.reject {|k,v| v.nil? }
|
133
|
+
end
|
134
|
+
|
135
|
+
def ==(other)
|
136
|
+
super && self.class._umembers.all? do |umember|
|
137
|
+
self.send(umember) == other.send(umember)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def inspect
|
142
|
+
super.gsub(/>$/, ' ' + umember_inspect + '>')
|
143
|
+
end
|
144
|
+
|
145
|
+
def umember_inspect
|
146
|
+
self.class._umembers.map {|u| u.to_s + '=' + send(u).inspect } * ' '
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
data/lib/dnapi/test.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'dnapi'
|
2
|
+
|
3
|
+
%w( randexp ey_slater ).each do |dep|
|
4
|
+
begin
|
5
|
+
require dep
|
6
|
+
rescue LoadError => e
|
7
|
+
puts "**** Looks like you forgot to add #{dep} as a test dependency ****"
|
8
|
+
raise e
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'dnapi/test/sweatshop'
|
13
|
+
require 'dnapi/test/ext'
|
14
|
+
|
15
|
+
DNApi::Struct.extend DNApi::Test::Ext
|
16
|
+
|
17
|
+
module DNApi
|
18
|
+
def self.gen(cluster, stack_name, app_types, attributes = {}, &block)
|
19
|
+
stack = DNApi::Stack.get(stack_name) || abort("Could not find the stack called #{stack_name.inspect}")
|
20
|
+
apps = app_types.map do |app_type|
|
21
|
+
DNApi::App.gen(app_type.to_sym)
|
22
|
+
end
|
23
|
+
Environment.gen(cluster.to_sym, attributes.merge(:stack => stack, :apps => apps), &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
BASE64 = (0..15).map {|i| i.to_s(16).upcase }
|
28
|
+
|
29
|
+
DNApi::Environment.fix {{
|
30
|
+
:alert_email => /\w+@example\.org/.gen,
|
31
|
+
:aws_secret_id => "00000" + 15.of { BASE64.pick }.join,
|
32
|
+
:aws_secret_key => "00000" + 35.of { BASE64.pick }.join,
|
33
|
+
:backup_interval => (1..24).pick,
|
34
|
+
:backup_window => (1..10).pick,
|
35
|
+
:name => "testing",
|
36
|
+
:db_stack => DNApi::DbStack::Mysql,
|
37
|
+
:ssh_username => "awesome",
|
38
|
+
:admin_ssh_key => "ssh-dss admin",
|
39
|
+
:ssh_keys => ["ssh-dss foo"],
|
40
|
+
:framework_env => %w( staging production qa custom ).pick,
|
41
|
+
:mailserver => /\w+\.example\.org/.gen,
|
42
|
+
:crons => 2.of { DNApi::Cron.gen }
|
43
|
+
}}
|
44
|
+
|
45
|
+
DNApi::Environment.fix(:single) do
|
46
|
+
DNApi::Environment.gen_attrs.merge(
|
47
|
+
:instances => [DNApi::Instance.gen(:role => :solo)]
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
DNApi::Environment.fix(:cluster) do
|
52
|
+
DNApi::Environment.gen_attrs.merge(
|
53
|
+
:instances => %w( app_master db_master ).map {|role| DNApi::Instance.gen(:role => role)}
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
DNApi::Environment.fix(:cluster_with_db_slave) do
|
58
|
+
attrs = DNApi::Environment.gen_attrs(:cluster)
|
59
|
+
attrs[:instances] << DNApi::Instance.gen(:role => :db_slave)
|
60
|
+
attrs
|
61
|
+
end
|
62
|
+
|
63
|
+
DNApi::Environment.fix(:cluster_with_utils) do
|
64
|
+
attrs = DNApi::Environment.gen_attrs(:cluster)
|
65
|
+
attrs[:instances] << DNApi::Instance.gen(:role => :util, :name => "Marriott")
|
66
|
+
attrs[:instances] << DNApi::Instance.gen(:role => :util, :name => "Courtyard")
|
67
|
+
attrs
|
68
|
+
end
|
69
|
+
|
70
|
+
DNApi::Instance.fix do
|
71
|
+
id = "fake-" + 8.of { BASE64.pick }.join
|
72
|
+
{
|
73
|
+
:enabled => true,
|
74
|
+
:id => id,
|
75
|
+
:public_hostname => "public-#{id}",
|
76
|
+
:private_hostname => "private-#{id}",
|
77
|
+
:reporting_url => "http://example.org/reporting/#{id}"
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
DNApi::App.fix(:rack) {{
|
82
|
+
:name => "testing-rack", :type => 'rack', :repository_name => "git@example.com:test-rack.git",
|
83
|
+
:domain_name => "_",
|
84
|
+
:database_name => "db-for-rack-app",
|
85
|
+
:gems => [{:name => 'wirble', :version => '0.1.3'}, {:name => 'nokogiri', :version => '1.3.0'}],
|
86
|
+
:ebuilds => ['irssi', 'enlightenment']
|
87
|
+
}}
|
88
|
+
|
89
|
+
DNApi::App.fix(:rails) {{
|
90
|
+
:name => "testing-rails", :type => 'rails', :repository_name => "git@example.com:test-rails.git",
|
91
|
+
:domain_name => "_",
|
92
|
+
:database_name => "db-for-rails-app",
|
93
|
+
:gems => [{:name => 'rails', :version => '1.0.3'}, {:name => 'crack', :version => '3.7.0'}],
|
94
|
+
:ebuilds => ['dwm', 'cowsay']
|
95
|
+
}}
|
96
|
+
|
97
|
+
DNApi::App.fix(:nodejs) {{
|
98
|
+
:name => "testing-nodejs", :type => 'nodejs', :repository_name => "git@example.com:test-nodejs.git",
|
99
|
+
:domain_name => "_",
|
100
|
+
:database_name => "db-for-nodejs-app",
|
101
|
+
:gems => [],
|
102
|
+
:ebuilds => ['dwm', 'cowsay']
|
103
|
+
}}
|
104
|
+
|
105
|
+
DNApi::Cron.fix {{
|
106
|
+
:name => /crontastic \d{3}/.gen,
|
107
|
+
:day => '*',
|
108
|
+
:hour => '*',
|
109
|
+
:minute => '*',
|
110
|
+
:month => '*',
|
111
|
+
:weekday => '*',
|
112
|
+
:command => 'echo "hi"',
|
113
|
+
:user => 'suicidal_pink_pony'
|
114
|
+
}}
|