miasma 0.3.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +4 -0
- data/LICENSE +1 -1
- data/README.md +5 -2
- data/lib/miasma.rb +14 -15
- data/lib/miasma/error.rb +17 -10
- data/lib/miasma/models.rb +9 -9
- data/lib/miasma/models/auto_scale.rb +5 -7
- data/lib/miasma/models/auto_scale/group.rb +8 -13
- data/lib/miasma/models/auto_scale/groups.rb +2 -4
- data/lib/miasma/models/block_storage.rb +1 -0
- data/lib/miasma/models/compute.rb +4 -6
- data/lib/miasma/models/compute/server.rb +5 -6
- data/lib/miasma/models/compute/servers.rb +2 -4
- data/lib/miasma/models/dns.rb +1 -0
- data/lib/miasma/models/load_balancer.rb +5 -7
- data/lib/miasma/models/load_balancer/balancer.rb +9 -11
- data/lib/miasma/models/load_balancer/balancers.rb +2 -4
- data/lib/miasma/models/monitoring.rb +1 -0
- data/lib/miasma/models/orchestration.rb +37 -7
- data/lib/miasma/models/orchestration/event.rb +2 -5
- data/lib/miasma/models/orchestration/events.rb +5 -7
- data/lib/miasma/models/orchestration/plan.rb +87 -0
- data/lib/miasma/models/orchestration/plans.rb +52 -0
- data/lib/miasma/models/orchestration/resource.rb +8 -10
- data/lib/miasma/models/orchestration/resources.rb +3 -5
- data/lib/miasma/models/orchestration/stack.rb +106 -20
- data/lib/miasma/models/orchestration/stacks.rb +3 -5
- data/lib/miasma/models/queues.rb +1 -0
- data/lib/miasma/models/queuing.rb +72 -0
- data/lib/miasma/models/queuing/queue.rb +77 -0
- data/lib/miasma/models/queuing/queues.rb +32 -0
- data/lib/miasma/models/storage.rb +8 -9
- data/lib/miasma/models/storage/bucket.rb +4 -7
- data/lib/miasma/models/storage/buckets.rb +2 -4
- data/lib/miasma/models/storage/file.rb +13 -16
- data/lib/miasma/models/storage/files.rb +3 -5
- data/lib/miasma/specs.rb +4 -4
- data/lib/miasma/specs/compute_abstract.rb +24 -33
- data/lib/miasma/specs/load_balancer_abstract.rb +17 -27
- data/lib/miasma/specs/orchestration_abstract.rb +26 -37
- data/lib/miasma/specs/storage_abstract.rb +21 -27
- data/lib/miasma/types.rb +6 -8
- data/lib/miasma/types/api.rb +28 -31
- data/lib/miasma/types/collection.rb +8 -10
- data/lib/miasma/types/data.rb +2 -5
- data/lib/miasma/types/model.rb +13 -16
- data/lib/miasma/types/thin_model.rb +7 -10
- data/lib/miasma/utils.rb +7 -7
- data/lib/miasma/utils/animal_strings.rb +1 -3
- data/lib/miasma/utils/api_methoding.rb +2 -5
- data/lib/miasma/utils/immutable.rb +2 -6
- data/lib/miasma/utils/lazy.rb +2 -2
- data/lib/miasma/utils/memoization.rb +1 -1
- data/lib/miasma/utils/smash.rb +1 -1
- data/lib/miasma/version.rb +1 -1
- data/miasma.gemspec +21 -19
- metadata +44 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b6ec4c699bde261e0e44469339a19cdcb55f58faad4c5ccbde0439321a22da83
|
4
|
+
data.tar.gz: d1d2c89ce389385c6e5a5a6462e201299e00b0f21da5d17ca9013e1149fe8df6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 564daaf08564aff07e67fdd1fe0b117ab86dad1fa3a9f17a34baf9774e456fb771ee3351de708e719446fd3a5c316a1b3c8cbcd686de98fa2f1c76dec9a8f8ad
|
7
|
+
data.tar.gz: 10832fe2f29d56c4096384e2486f2b6e71c9c0c7bd741f315cc6fc3b5a54766f24f45c3a378969df59cedc225381343e274f6b24c2a0b455acf09059c05279e1
|
data/CHANGELOG.md
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -148,9 +148,12 @@ should provide a simple feature matrix for a quick
|
|
148
148
|
check on support availability:
|
149
149
|
|
150
150
|
* [AWS](https://github.com/miasma-rb/miasma-aws)
|
151
|
-
* [
|
152
|
-
* [
|
151
|
+
* [Azure](https://github.com/miasma-rb/miasma-azure)
|
152
|
+
* [Google](https://github.com/miasma-rb/miasma-google)
|
153
153
|
* [Local](https://github.com/miasma-rb/miasma-local)
|
154
|
+
* [OpenStack](https://github.com/miasma-rb/miasma-open-stack)
|
155
|
+
* [Rackspace](https://github.com/miasma-rb/miasma-rackspace)
|
156
|
+
* [Terraform](https://github.com/miasma-rb/miasma-terraform)
|
154
157
|
|
155
158
|
## Info
|
156
159
|
|
data/lib/miasma.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# Load in dependencies
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
2
|
+
require "http"
|
3
|
+
require "bogo"
|
4
|
+
require "bogo/http_proxy"
|
5
|
+
require "multi_json"
|
6
|
+
require "multi_xml"
|
7
7
|
|
8
8
|
# Make version available
|
9
|
-
require
|
9
|
+
require "miasma/version"
|
10
10
|
|
11
11
|
module Miasma
|
12
|
-
autoload :Error,
|
13
|
-
autoload :Models,
|
14
|
-
autoload :Types,
|
15
|
-
autoload :Utils,
|
12
|
+
autoload :Error, "miasma/error"
|
13
|
+
autoload :Models, "miasma/models"
|
14
|
+
autoload :Types, "miasma/types"
|
15
|
+
autoload :Utils, "miasma/utils"
|
16
16
|
|
17
17
|
# Generate and API connection
|
18
18
|
#
|
@@ -20,10 +20,10 @@ module Miasma
|
|
20
20
|
# @option args [String, Symbol] :type API type (:compute, :dns, etc)
|
21
21
|
# @option args [String, Symbol] :provider Service provider
|
22
22
|
# @option args [Hash] :credentials Service provider credentials
|
23
|
-
def self.api(args={})
|
23
|
+
def self.api(args = {})
|
24
24
|
args = Utils::Smash.new(args)
|
25
25
|
[:type, :provider].each do |key|
|
26
|
-
unless
|
26
|
+
unless args[key]
|
27
27
|
raise ArgumentError.new "Missing required api argument `#{key.inspect}`!"
|
28
28
|
end
|
29
29
|
end
|
@@ -37,9 +37,9 @@ module Miasma
|
|
37
37
|
end
|
38
38
|
begin
|
39
39
|
base_klass = Models.const_get(args[:type])
|
40
|
-
if
|
40
|
+
if base_klass
|
41
41
|
api_klass = base_klass.const_get(args[:provider])
|
42
|
-
if
|
42
|
+
if api_klass
|
43
43
|
api_klass.new(args[:credentials].to_smash)
|
44
44
|
else
|
45
45
|
raise Error.new "Failed to locate #{args[:type]} API for #{args[:provider].inspect}"
|
@@ -51,5 +51,4 @@ module Miasma
|
|
51
51
|
raise Error.new "Failed to load requested API type #{args[:type].inspect} (Reason: #{e.class} - #{e})"
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
55
54
|
end
|
data/lib/miasma/error.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
# Generic Error class
|
@@ -9,7 +9,7 @@ module Miasma
|
|
9
9
|
# @param msg [String] error message
|
10
10
|
# @param args [Hash] optional arguments
|
11
11
|
# @return [self]
|
12
|
-
def initialize(msg, args={})
|
12
|
+
def initialize(msg, args = {})
|
13
13
|
super msg
|
14
14
|
end
|
15
15
|
|
@@ -26,7 +26,7 @@ module Miasma
|
|
26
26
|
# @param msg [String] error message
|
27
27
|
# @param args [Hash] optional arguments
|
28
28
|
# @option args [HTTP::Response] :response response from request
|
29
|
-
def initialize(msg, args={})
|
29
|
+
def initialize(msg, args = {})
|
30
30
|
super
|
31
31
|
@response = args.to_smash[:response]
|
32
32
|
@message = msg
|
@@ -35,7 +35,7 @@ module Miasma
|
|
35
35
|
|
36
36
|
# @return [String] provides response error suffix
|
37
37
|
def message
|
38
|
-
[@message, @response_error_msg].compact.join(
|
38
|
+
[@message, @response_error_msg].compact.join(" - ")
|
39
39
|
end
|
40
40
|
|
41
41
|
# Attempt to extract error message from response
|
@@ -47,16 +47,16 @@ module Miasma
|
|
47
47
|
begin
|
48
48
|
content = MultiJson.load(response.body.to_s).to_smash
|
49
49
|
@response_error_msg = [[:error, :message]].map do |path|
|
50
|
-
if
|
50
|
+
if result = content.get(*path)
|
51
51
|
"#{content[:code]}: #{result}"
|
52
52
|
end
|
53
53
|
end.flatten.compact.first
|
54
54
|
rescue MultiJson::ParseError
|
55
55
|
begin
|
56
56
|
content = MultiXml.parse(response.body.to_s).to_smash
|
57
|
-
@response_error_msg = [[
|
58
|
-
if
|
59
|
-
"#{result[
|
57
|
+
@response_error_msg = [["ErrorResponse", "Error"], ["Error"]].map do |path|
|
58
|
+
if result = content.get(*path)
|
59
|
+
"#{result["Code"]}: #{result["Message"]}"
|
60
60
|
end
|
61
61
|
end.compact.first
|
62
62
|
rescue MultiXml::ParseError
|
@@ -74,13 +74,21 @@ module Miasma
|
|
74
74
|
|
75
75
|
# Api authentication error
|
76
76
|
class AuthenticationError < ApiError; end
|
77
|
-
|
78
77
|
end
|
79
78
|
|
80
79
|
# Orchestration error
|
81
80
|
class OrchestrationError < Error
|
82
81
|
# Template failed to validate
|
83
82
|
class InvalidTemplate < OrchestrationError; end
|
83
|
+
|
84
|
+
# Stack is not in correct state for planning
|
85
|
+
class InvalidPlanState < OrchestrationError; end
|
86
|
+
|
87
|
+
# Plan is no longer valid for stack
|
88
|
+
class InvalidStackPlan < OrchestrationError; end
|
89
|
+
|
90
|
+
# Plan already exists
|
91
|
+
class StackPlanExists < OrchestrationError; end
|
84
92
|
end
|
85
93
|
|
86
94
|
# Invalid modification request
|
@@ -88,6 +96,5 @@ module Miasma
|
|
88
96
|
|
89
97
|
# Model has not been persisted
|
90
98
|
class ModelPersistError < Error; end
|
91
|
-
|
92
99
|
end
|
93
100
|
end
|
data/lib/miasma/models.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
|
-
autoload :AutoScale,
|
6
|
-
autoload :BlockStorage,
|
7
|
-
autoload :Compute,
|
8
|
-
autoload :Dns,
|
9
|
-
autoload :LoadBalancer,
|
10
|
-
autoload :Orchestration,
|
11
|
-
autoload :Queues,
|
12
|
-
autoload :Storage,
|
5
|
+
autoload :AutoScale, "miasma/models/auto_scale"
|
6
|
+
autoload :BlockStorage, "miasma/models/block_storage"
|
7
|
+
autoload :Compute, "miasma/models/compute"
|
8
|
+
autoload :Dns, "miasma/models/dns"
|
9
|
+
autoload :LoadBalancer, "miasma/models/load_balancer"
|
10
|
+
autoload :Orchestration, "miasma/models/orchestration"
|
11
|
+
autoload :Queues, "miasma/models/queues"
|
12
|
+
autoload :Storage, "miasma/models/storage"
|
13
13
|
end
|
14
14
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
5
|
# Abstract auto scale API
|
6
6
|
class AutoScale < Types::Api
|
7
|
-
|
8
|
-
autoload :
|
9
|
-
autoload :Groups, 'miasma/models/auto_scale/groups'
|
7
|
+
autoload :Group, "miasma/models/auto_scale/group"
|
8
|
+
autoload :Groups, "miasma/models/auto_scale/groups"
|
10
9
|
|
11
10
|
# Auto scale groups
|
12
11
|
#
|
13
12
|
# @param filter [Hash] filtering options
|
14
13
|
# @return [Types::Collection<Models::AutoScale::Groups>] auto scale groups
|
15
|
-
def groups(filter={})
|
14
|
+
def groups(filter = {})
|
16
15
|
memoize(:groups) do
|
17
16
|
Groups.new(self)
|
18
17
|
end
|
@@ -46,10 +45,9 @@ module Miasma
|
|
46
45
|
#
|
47
46
|
# @param options [Hash] filter
|
48
47
|
# @return [Array<Models::AutoScale::Group>]
|
49
|
-
def group_all(options={})
|
48
|
+
def group_all(options = {})
|
50
49
|
raise NotImplementedError
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
@@ -1,13 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
5
|
class AutoScale
|
6
6
|
# Abstract group
|
7
7
|
class Group < Types::Model
|
8
|
-
|
9
8
|
class Server < Types::ThinModel
|
10
|
-
|
11
9
|
model Miasma::Models::Compute::Server
|
12
10
|
attribute :name, String
|
13
11
|
|
@@ -18,7 +16,6 @@ module Miasma
|
|
18
16
|
end
|
19
17
|
|
20
18
|
class Balancer < Types::ThinModel
|
21
|
-
|
22
19
|
model Miasma::Models::LoadBalancer::Balancer
|
23
20
|
attribute :name, String
|
24
21
|
|
@@ -26,18 +23,17 @@ module Miasma
|
|
26
23
|
def expand
|
27
24
|
api.api_for(:load_balancer).balancers.get(self.id || self.name)
|
28
25
|
end
|
29
|
-
|
30
26
|
end
|
31
27
|
|
32
28
|
attribute :name, String, :required => true
|
33
|
-
attribute :created, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
34
|
-
attribute :load_balancers, Balancer, :multiple => true, :coerce => lambda{|v,obj| Balancer.new(obj.api, v)}
|
35
|
-
attribute :minimum_size, Integer, :coerce => lambda{|v| v.to_i}
|
36
|
-
attribute :maximum_size, Integer, :coerce => lambda{|v| v.to_i}
|
37
|
-
attribute :desired_size, Integer, :coerce => lambda{|v| v.to_i}
|
38
|
-
attribute :current_size, Integer, :coerce => lambda{|v| v.to_i}
|
29
|
+
attribute :created, Time, :coerce => lambda { |v| Time.parse(v.to_s) }
|
30
|
+
attribute :load_balancers, Balancer, :multiple => true, :coerce => lambda { |v, obj| Balancer.new(obj.api, v) }
|
31
|
+
attribute :minimum_size, Integer, :coerce => lambda { |v| v.to_i }
|
32
|
+
attribute :maximum_size, Integer, :coerce => lambda { |v| v.to_i }
|
33
|
+
attribute :desired_size, Integer, :coerce => lambda { |v| v.to_i }
|
34
|
+
attribute :current_size, Integer, :coerce => lambda { |v| v.to_i }
|
39
35
|
attribute :state, Symbol, :allowed_values => []
|
40
|
-
attribute :servers, Server, :multiple => true, :coerce => lambda{|v,obj| Server.new(obj.api_for(:compute), v)}
|
36
|
+
attribute :servers, Server, :multiple => true, :coerce => lambda { |v, obj| Server.new(obj.api_for(:compute), v) }
|
41
37
|
|
42
38
|
on_missing :reload
|
43
39
|
|
@@ -57,7 +53,6 @@ module Miasma
|
|
57
53
|
def perform_destroy
|
58
54
|
api.group_destroy(self)
|
59
55
|
end
|
60
|
-
|
61
56
|
end
|
62
57
|
end
|
63
58
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -11,7 +11,7 @@ module Miasma
|
|
11
11
|
#
|
12
12
|
# @param options [Hash] filter options
|
13
13
|
# @return [Array<Group>]
|
14
|
-
def filter(options={})
|
14
|
+
def filter(options = {})
|
15
15
|
raise NotImplementedError
|
16
16
|
end
|
17
17
|
|
@@ -26,9 +26,7 @@ module Miasma
|
|
26
26
|
def perform_population
|
27
27
|
api.group_all
|
28
28
|
end
|
29
|
-
|
30
29
|
end
|
31
|
-
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
5
|
# Abstract compute API
|
6
6
|
class Compute < Types::Api
|
7
|
-
|
8
|
-
autoload :
|
9
|
-
autoload :Servers, 'miasma/models/compute/servers'
|
7
|
+
autoload :Server, "miasma/models/compute/server"
|
8
|
+
autoload :Servers, "miasma/models/compute/servers"
|
10
9
|
|
11
10
|
# All compute instances
|
12
11
|
#
|
@@ -22,7 +21,7 @@ module Miasma
|
|
22
21
|
# @param filter [Hash] search filter
|
23
22
|
# @option filter [Symbol] :state state of server `Server::VALID_COMPUTE_STATES`
|
24
23
|
# @return [Array<Server>]
|
25
|
-
def server_filter(filter={})
|
24
|
+
def server_filter(filter = {})
|
26
25
|
end
|
27
26
|
|
28
27
|
# Create new server instance
|
@@ -64,7 +63,6 @@ module Miasma
|
|
64
63
|
def server_change_state(server, action)
|
65
64
|
raise NotImplementedError
|
66
65
|
end
|
67
|
-
|
68
66
|
end
|
69
67
|
end
|
70
68
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -28,11 +28,11 @@ module Miasma
|
|
28
28
|
attribute :flavor_id, [String, Numeric]
|
29
29
|
attribute :state, Symbol, :allowed => VALID_COMPUTE_STATES
|
30
30
|
attribute :status, String
|
31
|
-
attribute :addresses_public, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
32
|
-
attribute :addresses_private, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
33
|
-
attribute :networks, Network, :multiple => true, :coerce => lambda{|v| Network.new(v)}
|
31
|
+
attribute :addresses_public, Address, :multiple => true, :coerce => lambda { |v| Address.new(v) }
|
32
|
+
attribute :addresses_private, Address, :multiple => true, :coerce => lambda { |v| Address.new(v) }
|
33
|
+
attribute :networks, Network, :multiple => true, :coerce => lambda { |v| Network.new(v) }
|
34
34
|
attribute :personality, [Hash, String], :default => {}
|
35
|
-
attribute :metadata, Hash, :coerce => lambda{|o| o.to_smash}
|
35
|
+
attribute :metadata, Hash, :coerce => lambda { |o| o.to_smash }
|
36
36
|
attribute :key_name, String
|
37
37
|
|
38
38
|
on_missing :reload
|
@@ -67,7 +67,6 @@ module Miasma
|
|
67
67
|
api.server_destroy(self)
|
68
68
|
end
|
69
69
|
end
|
70
|
-
|
71
70
|
end
|
72
71
|
end
|
73
72
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -12,7 +12,7 @@ module Miasma
|
|
12
12
|
# @param options [Hash] filter options
|
13
13
|
# @option options [String] :state current instance state
|
14
14
|
# @return [Array<Server>]
|
15
|
-
def filter(options={})
|
15
|
+
def filter(options = {})
|
16
16
|
raise NotImplementedError
|
17
17
|
end
|
18
18
|
|
@@ -27,9 +27,7 @@ module Miasma
|
|
27
27
|
def perform_population
|
28
28
|
api.server_all
|
29
29
|
end
|
30
|
-
|
31
30
|
end
|
32
|
-
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
data/lib/miasma/models/dns.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -1,18 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
5
|
# Abstract load balancer API
|
6
6
|
class LoadBalancer < Types::Api
|
7
|
-
|
8
|
-
autoload :
|
9
|
-
autoload :Balancers, 'miasma/models/load_balancer/balancers'
|
7
|
+
autoload :Balancer, "miasma/models/load_balancer/balancer"
|
8
|
+
autoload :Balancers, "miasma/models/load_balancer/balancers"
|
10
9
|
|
11
10
|
# Load balancers
|
12
11
|
#
|
13
12
|
# @param filter [Hash] filtering options
|
14
13
|
# @return [Types::Collection<Models::LoadBalancer::Balancer>] auto scale groups
|
15
|
-
def balancers(filter={})
|
14
|
+
def balancers(filter = {})
|
16
15
|
memoize(:balancers) do
|
17
16
|
Balancers.new(self)
|
18
17
|
end
|
@@ -46,10 +45,9 @@ module Miasma
|
|
46
45
|
#
|
47
46
|
# @param options [Hash] filter
|
48
47
|
# @return [Array<Models::LoadBalancer::Balancer>]
|
49
|
-
def balancer_all(options={})
|
48
|
+
def balancer_all(options = {})
|
50
49
|
raise NotImplementedError
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|