mystro-common 0.1.11 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.gitignore +3 -0
  2. data/.rspec +2 -0
  3. data/CHANGELOG.md +42 -4
  4. data/Gemfile +7 -1
  5. data/Rakefile +137 -1
  6. data/lib/{mystro/ext/fog → fog/ext}/balancer.rb +0 -0
  7. data/lib/fog/ext/dynect/dns.rb +140 -0
  8. data/lib/fog/ext/dynect/models/dns/record.rb +66 -0
  9. data/lib/fog/ext/dynect/models/dns/records.rb +87 -0
  10. data/lib/fog/ext/dynect/models/dns/zone.rb +60 -0
  11. data/lib/fog/ext/dynect/models/dns/zones.rb +29 -0
  12. data/lib/fog/ext/dynect/requests/dns/delete_record.rb +56 -0
  13. data/lib/fog/ext/dynect/requests/dns/delete_zone.rb +42 -0
  14. data/lib/fog/ext/dynect/requests/dns/get_all_records.rb +56 -0
  15. data/lib/fog/ext/dynect/requests/dns/get_node_list.rb +56 -0
  16. data/lib/fog/ext/dynect/requests/dns/get_record.rb +85 -0
  17. data/lib/fog/ext/dynect/requests/dns/get_zone.rb +58 -0
  18. data/lib/fog/ext/dynect/requests/dns/post_record.rb +72 -0
  19. data/lib/fog/ext/dynect/requests/dns/post_session.rb +44 -0
  20. data/lib/fog/ext/dynect/requests/dns/post_zone.rb +71 -0
  21. data/lib/fog/ext/dynect/requests/dns/put_zone.rb +76 -0
  22. data/lib/fog/ext/dynect.rb +26 -0
  23. data/lib/mystro/cloud/action.rb +22 -0
  24. data/lib/mystro/cloud/connect/aws/balancer.rb +55 -0
  25. data/lib/mystro/cloud/connect/aws/compute.rb +151 -0
  26. data/lib/mystro/cloud/connect/aws/listener.rb +36 -0
  27. data/lib/mystro/cloud/connect/aws/record.rb +58 -0
  28. data/lib/mystro/cloud/connect/aws/zone.rb +35 -0
  29. data/lib/mystro/cloud/connect/aws.rb +14 -0
  30. data/lib/mystro/cloud/connect/dynect/record.rb +72 -0
  31. data/lib/mystro/cloud/connect/dynect/zone.rb +35 -0
  32. data/lib/mystro/cloud/connect/dynect.rb +17 -0
  33. data/lib/mystro/cloud/connect/fog.rb +66 -0
  34. data/lib/mystro/cloud/connect.rb +64 -0
  35. data/lib/mystro/cloud/model/balancer.rb +15 -0
  36. data/lib/mystro/cloud/model/compute.rb +27 -0
  37. data/lib/mystro/cloud/model/listener.rb +30 -0
  38. data/lib/mystro/cloud/model/record.rb +20 -0
  39. data/lib/mystro/cloud/model/volume.rb +12 -0
  40. data/lib/mystro/cloud/model/zone.rb +9 -0
  41. data/lib/mystro/cloud/model.rb +183 -0
  42. data/lib/mystro/cloud.rb +32 -0
  43. data/lib/mystro/common/version.rb +4 -3
  44. data/lib/mystro/dsl/balancer.rb +18 -0
  45. data/lib/mystro/dsl/compute.rb +57 -0
  46. data/lib/mystro/dsl/health.rb +7 -0
  47. data/lib/mystro/dsl/listener.rb +5 -0
  48. data/lib/mystro/dsl/oldtemplate.rb +281 -0
  49. data/lib/mystro/dsl/template.rb +12 -278
  50. data/lib/mystro/dsl/template_file.rb +18 -0
  51. data/lib/mystro/dsl/volume.rb +8 -0
  52. data/lib/mystro/dsl.rb +40 -0
  53. data/lib/mystro/organization.rb +83 -0
  54. data/lib/mystro/plugin.rb +4 -3
  55. data/lib/mystro/provider.rb +40 -0
  56. data/lib/mystro/userdata.rb +1 -1
  57. data/lib/mystro-common.rb +32 -31
  58. data/mystro-common.gemspec +2 -1
  59. data/spec/cloud/aws/balancer_spec.rb +10 -0
  60. data/spec/cloud/aws/compute_spec.rb +10 -0
  61. data/spec/cloud/aws/record_spec.rb +10 -0
  62. data/spec/cloud/dynect/record_spec.rb +10 -0
  63. data/spec/model/compute_spec.rb +36 -0
  64. data/spec/model/model_spec.rb +89 -0
  65. data/spec/model/record_spec.rb +27 -0
  66. data/spec/spec_helper.rb +36 -0
  67. data/spec/support/balancer.rb +49 -0
  68. data/spec/support/compute.rb +65 -0
  69. data/spec/support/record.rb +45 -0
  70. data/test/config.yml +71 -0
  71. metadata +99 -14
  72. data/lib/mystro/account.rb +0 -105
  73. data/lib/mystro/connect/balancer.rb +0 -91
  74. data/lib/mystro/connect/compute.rb +0 -100
  75. data/lib/mystro/connect/dns.rb +0 -51
  76. data/lib/mystro/connect/environment.rb +0 -31
  77. data/lib/mystro/connect.rb +0 -124
  78. data/lib/mystro/job.rb +0 -0
  79. data/lib/mystro/model.rb +0 -71
@@ -1,281 +1,15 @@
1
- module Mystro
2
- module DSL
3
- module Template
4
- class << self
5
- def load(name_or_file)
6
- @templates ||= {}
7
- template_name = nil
8
- template_file = nil
9
- if File.exists?(name_or_file)
10
- template_name = File.basename(name_or_file).gsub(/\.rb$/, "").to_sym
11
- template_file = name_or_file
12
- elsif File.exists?("#{dir}/#{name_or_file}.rb")
13
- template_name = name.to_sym
14
- template_file = "#{dir}/#{name}.rb"
15
- end
16
- raise "could not load template #{template_name} (#{template_file})" unless template_file && File.file?(template_file)
17
- #raise "template already loaded #{template_name}" if @templates[template_name]
18
- @templates[template_name] ||= begin
19
- t = Mystro::DSL::Template::DSL.new(template_name)
20
- t.instance_eval(File.read(template_file), "Template(#{template_file})")
21
- @templates[template_name] = t
22
- end
23
- end
24
-
25
- def load_yaml_file(path)
26
- file = File.expand_path(path)
27
- raise "Configuration not found: #{path} (#{file})" unless File.exists?(file)
28
- yaml = YAML.load_file(file)
29
- yaml = yaml[yaml.keys.first] if yaml.keys.count == 1
30
-
31
- yaml
32
- end
33
-
34
- def list
35
- Dir["#{dir}/*"].inject({}) do |h, e|
36
- f = e.gsub("#{dir}/", "")
37
- f = File.basename(f, ".yml")
38
- h[f.to_sym] = e
39
- h
40
- end
41
- end
42
-
43
- private
44
- def dir
45
- "#{Mystro.directory}/templates"
46
- end
47
- end
48
-
49
- class DSL
50
- attr_reader :balancers, :servers
51
-
52
- def initialize(name)
53
- @name = name.to_sym
54
- @balancers = []
55
- @servers = []
56
- end
57
-
58
- def template(&block)
59
- instance_eval &block
60
- end
61
-
62
- def balancer(name, &block)
63
- balancer = Balancer.new(name)
64
- balancer.instance_eval &block
65
- @balancers << balancer
66
- end
67
-
68
- def server(name, &block)
69
- server = Server.new(name)
70
- server.instance_eval &block
71
- @servers << server
72
- end
73
- end
74
-
75
- class Base
76
- def attr(name, value=nil)
77
- @attrs[name] = value unless value.nil?
78
- @attrs[name]
79
- end
80
-
81
- def list_attr(name, value=nil)
82
- @attrs[name] ||= []
83
- unless value.nil?
84
- if value.kind_of?(Array)
85
- @attrs[name] += value
86
- else
87
- @attrs[name] << value
88
- end
89
- end
90
- @attrs[name]
91
- end
92
- end
93
-
94
- class Server < Base
95
- def initialize(name)
96
- @attrs = {
97
- :name => name.to_sym,
98
- :roles => [],
99
- :groups => [],
100
- :count => 1,
101
- :image => nil,
102
- :flavor => nil,
103
- :keypair => nil,
104
- :userdata => "default",
105
- :dnsnames => [],
106
- }
107
- end
108
-
109
- def name
110
- @attrs[:name]
111
- end
112
-
113
- def roles
114
- @attrs[:roles]
115
- end
116
-
117
- def groups
118
- @attrs[:groups]
119
- end
120
-
121
- def dnsnames
122
- @attrs[:dnsnames]
123
- end
124
-
125
- def role(r)
126
- list_attr(:roles, r)
127
- end
128
-
129
- def count(c=nil)
130
- attr(:count, c)
131
- end
132
-
133
- def image(i=nil)
134
- attr(:image, i)
135
- end
136
-
137
- def flavor(f=nil)
138
- attr(:flavor, f)
139
- end
140
-
141
- def group(g)
142
- list_attr(:groups, g)
143
- end
144
-
145
- def keypair(k=nil)
146
- attr(:keypair, k)
147
- end
148
-
149
- def userdata(u=nil)
150
- attr(:userdata, u)
151
- end
152
-
153
- def balancer(b=nil, &block)
154
- if block_given?
155
- raise "balancer block must specify name" unless b
156
- Mystro::DSL::Template::DSL.balancer(b, &block)
157
- end
158
- attr(:balancer, b)
159
- end
160
-
161
- def dns(name)
162
- n = name.gsub(Mystro.get_config(:dns_zone), "")
163
- list_attr(:dnsnames, n)
164
- end
165
- end
166
-
167
- class Balancer
168
- attr_reader :name, :sticky, :primary, :sticky_type, :sticky_arg
169
-
170
- def initialize(name)
171
- @listeners = []
172
- @name = name.to_sym
173
- @primary = false
174
- @sticky = false
175
- end
176
-
177
- def primary(enable = nil)
178
- enable.nil? ? @primary : @primary = enable
179
- end
180
-
181
- def listener(&block)
182
- listener = Listener.new
183
- listener.instance_eval &block
184
- @listeners << listener
185
- end
186
-
187
- def health(&block)
188
- healthcheck = HealthCheck.new
189
- healthcheck.instance_eval &block
190
- @healthcheck = healthcheck
191
- end
192
-
193
- def listeners
194
- @listeners.map { |e| e.spec }
195
- end
196
-
197
- def sticky(type=nil, expires_or_cookie=nil)
198
- if type && expires_or_cookie
199
- @sticky = true
200
- @sticky_type = type
201
- @sticky_arg = expires_or_cookie
202
- end
203
- @sticky
204
- end
205
- end
206
-
207
- class Listener
208
- def initialize
209
- @from_proto = nil
210
- @from_port = nil
211
- @to_proto = nil
212
- @to_port = nil
213
- @cert = nil
214
- end
215
-
216
- def from(proto, port)
217
- @from_proto = proto
218
- @from_port = port
219
- end
220
-
221
- def to(proto, port)
222
- @to_proto = proto
223
- @to_port = port
224
- end
225
-
226
- def cert(cert)
227
- @cert = cert
228
- end
229
-
230
- def spec
231
- {
232
- :from => "#@from_proto:#@from_port",
233
- :to => "#@to_proto:#@to_port",
234
- :cert => @cert,
235
- }
236
- end
237
- end
238
-
239
- class HealthCheck
240
- def initialize
241
- @healthy = 10
242
- @unhealthy = 2
243
- @interval = 30
244
- @target = nil
245
- @timeout = 5
246
- end
247
-
248
- def healthy(v)
249
- @healthy = v
250
- end
251
-
252
- def unhealthy(v)
253
- @unhealthy = v
254
- end
255
-
256
- def interval(v)
257
- @interval = v
258
- end
259
-
260
- def target(v)
261
- @target = v
262
- end
263
-
264
- def timeout(v)
265
- @timeout = v
266
- end
267
-
268
- def spec
269
- raise "target not specified for health check" unless @target
270
- {
271
- healthy: @healthy,
272
- unhealthy: @unhealthy,
273
- interval: @interval,
274
- target: @target,
275
- timeout: @timeout,
276
- }
277
- end
278
- end
1
+ class Mystro::Dsl::Template < Mystro::Dsl::Base
2
+ has_many :computes, named: true
3
+ has_many :balancers, named: true
4
+
5
+ def actions
6
+ out = []
7
+ @data[:compute] && @data[:compute].each do |c|
8
+ out += c.actions
9
+ end
10
+ @data[:balancer] && @data[:balancer].each do |b|
11
+ out += b.actions
279
12
  end
13
+ out
280
14
  end
281
15
  end
@@ -0,0 +1,18 @@
1
+ class Mystro::Dsl::TemplateFile < Mystro::Dsl::Base
2
+ has_one :template
3
+ def actions
4
+ @data[:template].actions
5
+ end
6
+
7
+ def compute(name)
8
+ n = name.to_sym
9
+ dsl = computes.detect {|e| e[:name] == n}
10
+ raise "no template entry for compute #{n}" unless dsl
11
+ act = dsl.actions.first
12
+ act.to_model
13
+ end
14
+
15
+ def computes
16
+ @data[:template] && @data[:template][:compute]
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ class Mystro::Dsl::Volume < Mystro::Dsl::Base
2
+ attribute :name
3
+ attribute :device
4
+ attribute :size
5
+ attribute :dot
6
+ attribute :snapshot
7
+ attribute :virtual
8
+ end
data/lib/mystro/dsl.rb ADDED
@@ -0,0 +1,40 @@
1
+ require 'damsel/data'
2
+
3
+ module Mystro
4
+ module Dsl
5
+ class Base < Damsel::Data
6
+
7
+ end
8
+
9
+ class << self
10
+ def get(name)
11
+ n = name.to_sym
12
+ raise "no template named #{name}" unless @templates[n]
13
+ @templates[n]
14
+ end
15
+
16
+ def load(file)
17
+ @templates ||= {}
18
+ file = File.expand_path(file)
19
+ name = File.basename(file).gsub(/\.rb$/, "").to_sym
20
+ raise "file: '#{file}' does not exist" unless File.exist?(file)
21
+ @templates[name] ||= begin
22
+ t = Mystro::Dsl::TemplateFile.new(file)
23
+ t.instance_eval(File.read(file), "#{file}:[TemplateFile]")
24
+ t
25
+ end
26
+ end
27
+
28
+ def actions(name)
29
+ tf = get(name)
30
+ t = tf[:template]
31
+ t.actions
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ Dir["#{File.dirname(__FILE__)}/dsl/*rb"].each do |file|
38
+ #puts "dsl: #{file}"
39
+ require "#{file.gsub(/\.rb/, '')}"
40
+ end
@@ -0,0 +1,83 @@
1
+ require 'mystro/cloud'
2
+
3
+ module Mystro
4
+ class Organization
5
+ class << self
6
+ attr_reader :selected
7
+
8
+ def [](name)
9
+ get(name)
10
+ end
11
+
12
+ def get(name)
13
+ @list[name]
14
+ end
15
+
16
+ def read
17
+ dir = Mystro.directory
18
+ @list = {}
19
+
20
+ Dir["#{dir}/organizations/*.y*ml"].each do |file|
21
+ name = file.gsub(/#{dir}\/organizations\//, "").gsub(/\.(\w+?)$/, "")
22
+ Mystro::Log.debug "loading organization '#{name}' '#{file}'"
23
+ @list[name] = self.new(name, file)
24
+ end
25
+
26
+ @selected = default
27
+ end
28
+
29
+ def default
30
+ return ENV['MYSTRO_ORGANIZATION'] if ENV['MYSTRO_ORGANIZATION']
31
+ return Mystro.config.default_organization if Mystro.config.default_organization?
32
+ return "default" if @list.keys.include?("default")
33
+ @list.keys.first
34
+ end
35
+
36
+ def select(name)
37
+ @selected = name
38
+ end
39
+ end
40
+
41
+ attr_reader :data
42
+ attr_reader :file
43
+ attr_reader :name
44
+
45
+ def initialize(name, file)
46
+ cfg = Mystro.config.to_hash
47
+ organization = File.exists?(file) ? YAML.load_file(file) : {}
48
+ @name = name
49
+ @file = file
50
+ @data = Hashie::Mash.new(cfg.deep_merge(organization))
51
+ @data.name = name
52
+ end
53
+
54
+ def to_hash
55
+ @data.to_hash
56
+ end
57
+
58
+ def compute
59
+ @compute ||= connect(:compute)
60
+ end
61
+
62
+ def balancer
63
+ @balancer ||= connect(:balancer)
64
+ end
65
+
66
+ def record
67
+ @dns ||= connect(:record)
68
+ end
69
+
70
+ protected
71
+
72
+ def connect(type)
73
+ raise "#{type} not configured: see mystro/config.yml or mystro/organization/#{@name}.yml" unless @data[type]
74
+ raise "#{type} provider not configured: see mystro/config.yml or mystro/organization/#{@name}.yml" unless @data[type].provider!.name
75
+ return false if @data[type].disabled? && @data[type].disabled == true
76
+ options = @data[type].provider.to_hash.symbolize_keys
77
+ config = @data[type].config.to_hash.symbolize_keys if @data[type].config
78
+ pn = options.delete(:name)
79
+ raise "provider not set" unless pn
80
+ Mystro::Cloud.new(pn, type, {options: options, config: config})
81
+ end
82
+ end
83
+ end
data/lib/mystro/plugin.rb CHANGED
@@ -24,7 +24,8 @@ module Mystro
24
24
  end
25
25
 
26
26
  def load(plugins={ })
27
- plugins.each do |plugin, data|
27
+ list = plugins.reject {|k, v| k == 'disabled'}
28
+ list.each do |plugin, data|
28
29
  begin
29
30
  f = "#{Mystro.directory}/plugins/#{plugin}"
30
31
  Mystro::Log.debug "loading plugin: #{plugin} #{f}"
@@ -37,7 +38,7 @@ module Mystro
37
38
 
38
39
  def disabled?(name)
39
40
  Mystro::Log.debug "disabled? #{name}"
40
- Mystro.config.disabled && Mystro.config.disabled[name]
41
+ Mystro.config.plugins && Mystro.config.plugins.disabled && Mystro.config.plugins.disabled[name]
41
42
  end
42
43
 
43
44
  def register(key, opts={})
@@ -95,7 +96,7 @@ module Mystro
95
96
 
96
97
  def config_for(klass)
97
98
  name = klass.name.split('::').last.downcase.to_sym
98
- return Mystro.account.plugins[name] if Mystro.account.plugins && Mystro.account.plugins[name]
99
+ return Mystro.organization.plugins[name] if Mystro.organization.plugins && Mystro.organization.plugins[name]
99
100
  { }
100
101
  end
101
102
 
@@ -0,0 +1,40 @@
1
+ module Mystro
2
+ class Provider
3
+ class << self
4
+ def [](name)
5
+ get(name)
6
+ end
7
+
8
+ def get(name)
9
+ @list ||= {}
10
+ @list[name]
11
+ end
12
+
13
+ def read
14
+ dir = Mystro.directory
15
+ @list ||= { }
16
+
17
+ Dir["#{dir}/providers/*.y*ml"].each do |file|
18
+ name = file.gsub(/#{dir}\/providers\//, "").gsub(/\.(\w+?)$/, "")
19
+ Mystro::Log.debug "loading provider '#{name}' '#{file}'"
20
+ @list[name] = self.new(name, file)
21
+ end
22
+ end
23
+ end
24
+
25
+ attr_reader :data
26
+ attr_reader :file
27
+ attr_reader :name
28
+
29
+ def initialize(name, file)
30
+ yaml = File.exists?(file) ? YAML.load_file(file) : { }
31
+ @name = name
32
+ @file = file
33
+ @data = Hashie::Mash.new(yaml)
34
+ end
35
+
36
+ def to_hash
37
+ @data.to_hash.symbolize_keys
38
+ end
39
+ end
40
+ end
@@ -22,7 +22,7 @@ module Mystro
22
22
  :roles => roles,
23
23
  :environment => environment,
24
24
  :nickname => name,
25
- :account => "unknown",
25
+ :organization => "unknown",
26
26
  :zone => "unknown.local",
27
27
  :dependencies => [],
28
28
  :gems => [],
data/lib/mystro-common.rb CHANGED
@@ -1,8 +1,6 @@
1
- require "mystro/common/version"
2
- require "fog"
3
- require "mystro/ext/fog/balancer"
4
- require "hashie/mash"
5
- require "active_support/all"
1
+ require 'mystro/common/version'
2
+ require 'hashie/mash'
3
+ require 'active_support/all'
6
4
 
7
5
  module Mystro
8
6
  class << self
@@ -10,58 +8,61 @@ module Mystro
10
8
  Mystro::Config.instance.data
11
9
  end
12
10
 
13
- def account
14
- raise "mystro account unset! default account ('#{config.default_account}') doesn't exist?" unless current_account
15
- current_account.data
11
+ def organization
12
+ raise "mystro organization unset! default organization ('#{config.default_organization}') doesn't exist?" unless current_organization
13
+ current_organization.data
16
14
  end
17
15
 
18
- def current_account
19
- Mystro::Account.get(selected)
16
+ def current_organization
17
+ Mystro::Organization.get(selected)
20
18
  end
21
19
 
22
20
  def directory
23
21
  @dir ||= begin
24
- d = "~/.mystro"
25
- if ENV["MYSTRO_CONFIG"]
26
- d = ENV["MYSTRO_CONFIG"]
27
- elsif File.exists?("./config/mystro")
28
- d = "./config/mystro"
29
- elsif File.exists?("./.mystro")
30
- d = "./.mystro"
22
+ d = '~/.mystro'
23
+ if ENV['MYSTRO_CONFIG']
24
+ d = ENV['MYSTRO_CONFIG']
25
+ elsif File.exists?('./config/mystro')
26
+ d = './config/mystro'
27
+ elsif File.exists?('./.mystro')
28
+ d = './.mystro'
31
29
  end
32
30
  File.expand_path(d)
33
31
  end
34
32
  end
35
33
 
36
34
  def selected
37
- Mystro::Account.selected
35
+ Mystro::Organization.selected
38
36
  end
39
37
 
40
38
  def compute
41
- current_account.compute
39
+ current_organization.compute
42
40
  end
43
41
 
44
- def dns
45
- current_account.dns
42
+ def record
43
+ current_organization.record
46
44
  end
47
45
 
48
46
  def balancer
49
- current_account.balancer
47
+ current_organization.balancer
50
48
  end
51
49
 
52
50
  def environment
53
- current_account.environment
51
+ current_organization.environment
54
52
  end
55
53
  end
56
54
  end
57
55
 
58
- require "mystro/config"
59
- require "mystro/account"
60
- require "mystro/log"
61
- require "mystro/dsl/template"
62
- require "mystro/plugin"
63
- require "mystro/connect"
64
- require "mystro/userdata"
56
+ require 'mystro/config'
57
+ require 'mystro/log'
58
+ require 'mystro/cloud'
59
+ require 'mystro/provider'
60
+ require 'mystro/organization'
61
+ require 'mystro/dsl/oldtemplate'
62
+ require 'mystro/plugin'
63
+ require 'mystro/userdata'
64
+ require 'mystro/dsl'
65
65
 
66
66
  Mystro::Config.instance
67
- Mystro::Account.read
67
+ Mystro::Provider.read
68
+ Mystro::Organization.read
@@ -17,10 +17,11 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency "fog", "~> 1.12.1" # talk to cloud
20
+ gem.add_dependency "fog", "~> 1.15.0" # talk to cloud
21
21
  gem.add_dependency "yell", "~> 1.2.0" # logging
22
22
  gem.add_dependency "hashie" # better data objects
23
23
  gem.add_dependency "activesupport", "3.2.14" # active support
24
24
  gem.add_dependency "ipaddress" # ip address library
25
25
  gem.add_dependency "erubis" # userdata templates
26
+ gem.add_dependency "damsel", "~> 0.1.0" # dsl
26
27
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ describe Mystro::Cloud::Aws::Balancer, :aws do
3
+ def cloud
4
+ @cloud ||= connect('aws', 'balancer')
5
+ end
6
+ def config
7
+ @config ||= load_config('aws', 'balancer')
8
+ end
9
+ it_behaves_like 'cloud balancer'
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ describe Mystro::Cloud::Aws::Compute, :aws do
3
+ def cloud
4
+ @cloud ||= connect('aws', 'compute')
5
+ end
6
+ def config
7
+ @config ||= load_config('aws', 'compute')
8
+ end
9
+ it_behaves_like 'cloud compute'
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ describe Mystro::Cloud::Aws::Record, :aws do
3
+ def cloud
4
+ @cloud ||= connect('aws', 'record')
5
+ end
6
+ def config
7
+ @config ||= load_config('aws', 'record')
8
+ end
9
+ it_behaves_like 'cloud record'
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ describe Mystro::Cloud::Dynect::Record, :dynect do
3
+ def cloud
4
+ @cloud ||= connect('dynect', 'record')
5
+ end
6
+ def config
7
+ @config ||= load_config('dynect', 'record')
8
+ end
9
+ it_behaves_like 'cloud record'
10
+ end