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
@@ -1,11 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
5
5
|
class LoadBalancer
|
6
6
|
# Abstract balancer
|
7
7
|
class Balancer < Types::Model
|
8
|
-
|
9
8
|
class Server < Types::ThinModel
|
10
9
|
model Miasma::Models::Compute::Server
|
11
10
|
end
|
@@ -41,14 +40,14 @@ module Miasma
|
|
41
40
|
attribute :name, String
|
42
41
|
attribute :state, Symbol, :allowed_values => [:active, :pending, :terminated]
|
43
42
|
attribute :status, String
|
44
|
-
attribute :servers, Server, :multiple => true, :coerce => lambda{|v| Server.new(v)}
|
45
|
-
attribute :public_addresses, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
46
|
-
attribute :private_addresses, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
47
|
-
attribute :health_check, HealthCheck, :coerce => lambda{|v| HealthCheck.new(v)}
|
48
|
-
attribute :listeners, Listener, :coerce => lambda{|v| Listener.new(v)}, :multiple => true
|
49
|
-
attribute :created, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
50
|
-
attribute :updated, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
51
|
-
attribute :server_states, ServerState, :multiple => true, :coerce => lambda{|v| ServerState.new(v)}
|
43
|
+
attribute :servers, Server, :multiple => true, :coerce => lambda { |v| Server.new(v) }
|
44
|
+
attribute :public_addresses, Address, :multiple => true, :coerce => lambda { |v| Address.new(v) }
|
45
|
+
attribute :private_addresses, Address, :multiple => true, :coerce => lambda { |v| Address.new(v) }
|
46
|
+
attribute :health_check, HealthCheck, :coerce => lambda { |v| HealthCheck.new(v) }
|
47
|
+
attribute :listeners, Listener, :coerce => lambda { |v| Listener.new(v) }, :multiple => true
|
48
|
+
attribute :created, Time, :coerce => lambda { |v| Time.parse(v.to_s) }
|
49
|
+
attribute :updated, Time, :coerce => lambda { |v| Time.parse(v.to_s) }
|
50
|
+
attribute :server_states, ServerState, :multiple => true, :coerce => lambda { |v| ServerState.new(v) }
|
52
51
|
|
53
52
|
on_missing :reload
|
54
53
|
|
@@ -73,7 +72,6 @@ module Miasma
|
|
73
72
|
def perform_destroy
|
74
73
|
api.balancer_destroy(self)
|
75
74
|
end
|
76
|
-
|
77
75
|
end
|
78
76
|
end
|
79
77
|
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<Balancer>]
|
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.balancer_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 orchestration API
|
6
6
|
class Orchestration < Types::Api
|
7
|
-
|
8
|
-
autoload :
|
9
|
-
autoload :Stacks, 'miasma/models/orchestration/stacks'
|
7
|
+
autoload :Stack, "miasma/models/orchestration/stack"
|
8
|
+
autoload :Stacks, "miasma/models/orchestration/stacks"
|
10
9
|
|
11
10
|
# @return [Smash] mapping of remote type to internal type
|
12
11
|
RESOURCE_MAPPING = Smash.new
|
@@ -26,14 +25,14 @@ module Miasma
|
|
26
25
|
:rollback_complete, :rollback_in_progress, :rollback_failed,
|
27
26
|
:update_complete, :update_in_progress, :update_failed,
|
28
27
|
:update_rollback_complete, :update_rollback_in_progress,
|
29
|
-
:update_rollback_failed, :unknown
|
28
|
+
:update_rollback_failed, :unknown,
|
30
29
|
]
|
31
30
|
|
32
31
|
# Orchestration stacks
|
33
32
|
#
|
34
33
|
# @param filter [Hash] filtering options
|
35
34
|
# @return [Types::Collection<Models::Orchestration::Stack>] stacks
|
36
|
-
def stacks(args={})
|
35
|
+
def stacks(args = {})
|
37
36
|
memoize(:stacks) do
|
38
37
|
Stacks.new(self)
|
39
38
|
end
|
@@ -67,7 +66,7 @@ module Miasma
|
|
67
66
|
#
|
68
67
|
# @param options [Hash] filter
|
69
68
|
# @return [Array<Models::Orchestration::Stack>]
|
70
|
-
def stack_all(options={})
|
69
|
+
def stack_all(options = {})
|
71
70
|
raise NotImplementedError
|
72
71
|
end
|
73
72
|
|
@@ -87,6 +86,22 @@ module Miasma
|
|
87
86
|
raise NotImplementedError
|
88
87
|
end
|
89
88
|
|
89
|
+
# Plan stack update
|
90
|
+
#
|
91
|
+
# @param stack [Stack]
|
92
|
+
# @return [Plan]
|
93
|
+
def stack_plan(stack)
|
94
|
+
raise NotImplementedError
|
95
|
+
end
|
96
|
+
|
97
|
+
# Load plan for stack
|
98
|
+
#
|
99
|
+
# @param stack [Stack]
|
100
|
+
# @return [Plan]
|
101
|
+
def stack_plan_load(stack)
|
102
|
+
raise NotImplementedError
|
103
|
+
end
|
104
|
+
|
90
105
|
# Return all resources for stack
|
91
106
|
#
|
92
107
|
# @param stack [Models::Orchestration::Stack]
|
@@ -127,6 +142,21 @@ module Miasma
|
|
127
142
|
raise NotImplementedError
|
128
143
|
end
|
129
144
|
|
145
|
+
# Return all plans for stack
|
146
|
+
#
|
147
|
+
# @param stack [Models::Orchestration::Stack]
|
148
|
+
# @return [Array<Models::Orchestration::Stack::Plan>]
|
149
|
+
def stack_plan_all(stack)
|
150
|
+
raise NotImplementedError
|
151
|
+
end
|
152
|
+
|
153
|
+
# Reload the plan data from the API
|
154
|
+
#
|
155
|
+
# @param plan [Models::Orchestration::Stack::Plan]
|
156
|
+
# @return [Models::Orchestration::Stack::Plan]
|
157
|
+
def stack_plan_reload(plan)
|
158
|
+
raise NotImplementedError
|
159
|
+
end
|
130
160
|
end
|
131
161
|
end
|
132
162
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -7,7 +7,6 @@ module Miasma
|
|
7
7
|
|
8
8
|
# Stack event
|
9
9
|
class Event < Types::Model
|
10
|
-
|
11
10
|
attribute :time, Time, :required => true
|
12
11
|
attribute :resource_id, [String, Numeric], :required => true
|
13
12
|
attribute :resource_logical_id, [String, Numeric]
|
@@ -18,7 +17,7 @@ module Miasma
|
|
18
17
|
|
19
18
|
attr_reader :stack
|
20
19
|
|
21
|
-
def initialize(stack, args={})
|
20
|
+
def initialize(stack, args = {})
|
22
21
|
@stack = stack
|
23
22
|
super stack.api, args
|
24
23
|
end
|
@@ -29,9 +28,7 @@ module Miasma
|
|
29
28
|
end
|
30
29
|
|
31
30
|
include Utils::Immutable
|
32
|
-
|
33
31
|
end
|
34
|
-
|
35
32
|
end
|
36
33
|
end
|
37
34
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -23,7 +23,7 @@ module Miasma
|
|
23
23
|
#
|
24
24
|
# @param options [Hash] filter options
|
25
25
|
# @return [Array<Event>]
|
26
|
-
def filter(options={})
|
26
|
+
def filter(options = {})
|
27
27
|
raise NotImplementedError
|
28
28
|
end
|
29
29
|
|
@@ -31,7 +31,7 @@ module Miasma
|
|
31
31
|
#
|
32
32
|
# @param args [Hash] creation options
|
33
33
|
# @return [Event]
|
34
|
-
def build(args={})
|
34
|
+
def build(args = {})
|
35
35
|
Event.new(stack, args.to_smash)
|
36
36
|
end
|
37
37
|
|
@@ -44,9 +44,9 @@ module Miasma
|
|
44
44
|
#
|
45
45
|
# @return [Array<Event>] new events fetched
|
46
46
|
def update!
|
47
|
-
if
|
47
|
+
if memoized?(:collection)
|
48
48
|
current_events = all
|
49
|
-
if
|
49
|
+
if api.respond_to?(:event_all_new)
|
50
50
|
new_events = api.event_all_new(self)
|
51
51
|
unmemoize(:collection)
|
52
52
|
memoize(:collection) do
|
@@ -67,9 +67,7 @@ module Miasma
|
|
67
67
|
def perform_population
|
68
68
|
api.event_all(stack)
|
69
69
|
end
|
70
|
-
|
71
70
|
end
|
72
|
-
|
73
71
|
end
|
74
72
|
end
|
75
73
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "miasma"
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class Orchestration
|
6
|
+
class Stack
|
7
|
+
# Stack update plan
|
8
|
+
class Plan < Types::Model
|
9
|
+
attr_reader :stack
|
10
|
+
|
11
|
+
def initialize(stack, args = {})
|
12
|
+
@stack = stack
|
13
|
+
super stack.api, args
|
14
|
+
end
|
15
|
+
|
16
|
+
class Diff < Types::Data
|
17
|
+
attribute :name, String, :required => true
|
18
|
+
attribute :current, String, :required => true
|
19
|
+
attribute :proposed, String, :required => true
|
20
|
+
end
|
21
|
+
|
22
|
+
# Plan item
|
23
|
+
class Item < Types::Data
|
24
|
+
attribute :name, String, :required => true
|
25
|
+
attribute :type, String, :required => true
|
26
|
+
attribute :diffs, Diff, :multiple => true
|
27
|
+
end
|
28
|
+
|
29
|
+
attribute :name, String, :coerce => lambda { |x| x.to_s }
|
30
|
+
attribute :add, Item, :multiple => true
|
31
|
+
attribute :remove, Item, :multiple => true
|
32
|
+
attribute :replace, Item, :multiple => true
|
33
|
+
attribute :interrupt, Item, :multiple => true
|
34
|
+
attribute :unavailable, Item, :multiple => true
|
35
|
+
attribute :unknown, Item, :multiple => true
|
36
|
+
attribute :stacks, Smash
|
37
|
+
attribute :state, String, :coerce => lambda { |x| x.to_s }
|
38
|
+
attribute :parameters, Smash, :default => Smash.new
|
39
|
+
attribute :template, Smash, :default => Smash.new
|
40
|
+
attribute :created_at, Time, :coerce => lambda { |x| Time.parse(x.to_s) }
|
41
|
+
|
42
|
+
DIFF_ATTRIBUTES = [
|
43
|
+
:add, :remove, :replace, :interrupt, :unavailable, :unknown,
|
44
|
+
]
|
45
|
+
|
46
|
+
# Plan has no modifications
|
47
|
+
#
|
48
|
+
# @return [TrueClass, FalseClass]
|
49
|
+
def empty?
|
50
|
+
DIFF_ATTRIBUTES.all? { |attr|
|
51
|
+
self.send(attr).empty?
|
52
|
+
} && stacks.values.all? { |stk| stk.empty? }
|
53
|
+
end
|
54
|
+
|
55
|
+
# Execute this stack plan
|
56
|
+
#
|
57
|
+
# @return [Stack]
|
58
|
+
def execute!
|
59
|
+
if self == stack.plan
|
60
|
+
stack.plan_execute
|
61
|
+
else
|
62
|
+
raise Error::OrchestrationError::InvalidStackPlan.new "Plan is no longer valid for linked stack."
|
63
|
+
end
|
64
|
+
stack.reload
|
65
|
+
end
|
66
|
+
|
67
|
+
# Destroy this stack plan
|
68
|
+
#
|
69
|
+
# @return [Stack]
|
70
|
+
def destroy
|
71
|
+
if self == stack.plan
|
72
|
+
stack.plan_destroy
|
73
|
+
else
|
74
|
+
raise Error::OrchestrationError::InvalidStackPlan.new "Plan is no longer valid for linked stack."
|
75
|
+
end
|
76
|
+
stack.reload
|
77
|
+
end
|
78
|
+
|
79
|
+
# Proxy reload action up to the API
|
80
|
+
def perform_reload
|
81
|
+
api.stack_plan_reload(self)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "miasma"
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class Orchestration
|
6
|
+
class Stack
|
7
|
+
# Abstract stack plans collection
|
8
|
+
class Plans < Types::Collection
|
9
|
+
|
10
|
+
# @return [Miasma::Models::Orchestration::Stack]
|
11
|
+
attr_reader :stack
|
12
|
+
|
13
|
+
# Override to capture originating stack
|
14
|
+
#
|
15
|
+
# @param stack [Stack]
|
16
|
+
def initialize(stack)
|
17
|
+
@stack = stack
|
18
|
+
super stack.api
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return plans matching given filter
|
22
|
+
#
|
23
|
+
# @param options [Hash] filter options
|
24
|
+
# @return [Array<Plans>]
|
25
|
+
def filter(options = {})
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
# Build a new plan instance
|
30
|
+
#
|
31
|
+
# @param args [Hash] creation options
|
32
|
+
# @return [Plan]
|
33
|
+
def build(args = {})
|
34
|
+
Plan.new(stack, args.to_smash)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Plan] collection item class
|
38
|
+
def model
|
39
|
+
Plan
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
# @return [Array<Plan>]
|
45
|
+
def perform_population
|
46
|
+
api.stack_plan_all(stack)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -7,20 +7,19 @@ module Miasma
|
|
7
7
|
|
8
8
|
# Stack resource
|
9
9
|
class Resource < Types::Model
|
10
|
-
|
11
10
|
attribute :name, String, :required => true
|
12
11
|
attribute :type, String, :required => true
|
13
12
|
attribute :logical_id, [String, Numeric]
|
14
13
|
attribute :state, Symbol, :required => true, :allowed_values => Orchestration::VALID_RESOURCE_STATES
|
15
|
-
attribute :status, [String, Symbol], :required => true, :coerce => lambda{|v| v.to_s.to_sym}
|
14
|
+
attribute :status, [String, Symbol], :required => true, :coerce => lambda { |v| v.to_s.to_sym }
|
16
15
|
attribute :status_reason, String
|
17
|
-
attribute :updated, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
16
|
+
attribute :updated, Time, :coerce => lambda { |v| Time.parse(v.to_s) }
|
18
17
|
|
19
18
|
on_missing :reload
|
20
19
|
|
21
20
|
attr_reader :stack
|
22
21
|
|
23
|
-
def initialize(stack, args={})
|
22
|
+
def initialize(stack, args = {})
|
24
23
|
@stack = stack
|
25
24
|
super stack.api, args
|
26
25
|
end
|
@@ -28,15 +27,15 @@ module Miasma
|
|
28
27
|
# @return [Miasma::Types::Model] provides mapped resource class
|
29
28
|
def dereference
|
30
29
|
# Insert provider to namespace
|
31
|
-
provider_const = self.class.name.split(
|
30
|
+
provider_const = self.class.name.split("::").insert(3, Utils.camel(api.provider))
|
32
31
|
provider_const.slice!(-2, 2)
|
33
32
|
# Insert mapping constant name and fetch
|
34
|
-
|
33
|
+
const = provider_const.push(:RESOURCE_MAPPING).inject(Object) do |memo, konst|
|
35
34
|
res = memo.const_get(konst)
|
36
35
|
break unless res
|
37
36
|
res
|
38
37
|
end
|
39
|
-
unless
|
38
|
+
unless const[self.type]
|
40
39
|
raise KeyError.new "Failed to locate requested mapping! (`#{self.type}`)"
|
41
40
|
end
|
42
41
|
const[self.type]
|
@@ -49,6 +48,7 @@ module Miasma
|
|
49
48
|
info = dereference
|
50
49
|
api.api_for(info[:api]).send(info[:collection]).get(self.id)
|
51
50
|
end
|
51
|
+
|
52
52
|
alias_method :instance, :expand
|
53
53
|
|
54
54
|
# Proxy reload action up to the API
|
@@ -72,9 +72,7 @@ module Miasma
|
|
72
72
|
end
|
73
73
|
|
74
74
|
include Utils::Immutable
|
75
|
-
|
76
75
|
end
|
77
|
-
|
78
76
|
end
|
79
77
|
end
|
80
78
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "miasma"
|
2
2
|
|
3
3
|
module Miasma
|
4
4
|
module Models
|
@@ -23,7 +23,7 @@ module Miasma
|
|
23
23
|
#
|
24
24
|
# @param options [Hash] filter options
|
25
25
|
# @return [Array<Resources>]
|
26
|
-
def filter(options={})
|
26
|
+
def filter(options = {})
|
27
27
|
raise NotImplementedError
|
28
28
|
end
|
29
29
|
|
@@ -31,7 +31,7 @@ module Miasma
|
|
31
31
|
#
|
32
32
|
# @param args [Hash] creation options
|
33
33
|
# @return [Resource]
|
34
|
-
def build(args={})
|
34
|
+
def build(args = {})
|
35
35
|
Resource.new(stack, args.to_smash)
|
36
36
|
end
|
37
37
|
|
@@ -46,9 +46,7 @@ module Miasma
|
|
46
46
|
def perform_population
|
47
47
|
api.resource_all(stack)
|
48
48
|
end
|
49
|
-
|
50
49
|
end
|
51
|
-
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|