miasma 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -0
- data/README.md +179 -0
- data/lib/miasma.rb +52 -0
- data/lib/miasma/contrib/aws.rb +390 -0
- data/lib/miasma/contrib/aws/auto_scale.rb +85 -0
- data/lib/miasma/contrib/aws/compute.rb +112 -0
- data/lib/miasma/contrib/aws/load_balancer.rb +185 -0
- data/lib/miasma/contrib/aws/orchestration.rb +338 -0
- data/lib/miasma/contrib/rackspace.rb +164 -0
- data/lib/miasma/contrib/rackspace/auto_scale.rb +84 -0
- data/lib/miasma/contrib/rackspace/compute.rb +104 -0
- data/lib/miasma/contrib/rackspace/load_balancer.rb +117 -0
- data/lib/miasma/contrib/rackspace/orchestration.rb +255 -0
- data/lib/miasma/error.rb +89 -0
- data/lib/miasma/models.rb +14 -0
- data/lib/miasma/models/auto_scale.rb +55 -0
- data/lib/miasma/models/auto_scale/group.rb +64 -0
- data/lib/miasma/models/auto_scale/groups.rb +34 -0
- data/lib/miasma/models/block_storage.rb +0 -0
- data/lib/miasma/models/compute.rb +70 -0
- data/lib/miasma/models/compute/server.rb +71 -0
- data/lib/miasma/models/compute/servers.rb +35 -0
- data/lib/miasma/models/dns.rb +0 -0
- data/lib/miasma/models/load_balancer.rb +55 -0
- data/lib/miasma/models/load_balancer/balancer.rb +72 -0
- data/lib/miasma/models/load_balancer/balancers.rb +34 -0
- data/lib/miasma/models/monitoring.rb +0 -0
- data/lib/miasma/models/orchestration.rb +127 -0
- data/lib/miasma/models/orchestration/event.rb +38 -0
- data/lib/miasma/models/orchestration/events.rb +64 -0
- data/lib/miasma/models/orchestration/resource.rb +79 -0
- data/lib/miasma/models/orchestration/resources.rb +55 -0
- data/lib/miasma/models/orchestration/stack.rb +144 -0
- data/lib/miasma/models/orchestration/stacks.rb +46 -0
- data/lib/miasma/models/queues.rb +0 -0
- data/lib/miasma/models/storage.rb +60 -0
- data/lib/miasma/models/storage/bucket.rb +36 -0
- data/lib/miasma/models/storage/buckets.rb +41 -0
- data/lib/miasma/models/storage/file.rb +45 -0
- data/lib/miasma/models/storage/files.rb +52 -0
- data/lib/miasma/types.rb +13 -0
- data/lib/miasma/types/api.rb +145 -0
- data/lib/miasma/types/collection.rb +116 -0
- data/lib/miasma/types/data.rb +53 -0
- data/lib/miasma/types/model.rb +118 -0
- data/lib/miasma/types/thin_model.rb +76 -0
- data/lib/miasma/utils.rb +12 -0
- data/lib/miasma/utils/animal_strings.rb +29 -0
- data/lib/miasma/utils/immutable.rb +36 -0
- data/lib/miasma/utils/lazy.rb +231 -0
- data/lib/miasma/utils/memoization.rb +55 -0
- data/lib/miasma/utils/smash.rb +149 -0
- data/lib/miasma/version.rb +4 -0
- data/miasma.gemspec +18 -0
- metadata +57 -3
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class AutoScale
|
6
|
+
|
7
|
+
# Abstract auto scale group collection
|
8
|
+
class Groups < Types::Collection
|
9
|
+
|
10
|
+
# Return auto scale groups matching given filter
|
11
|
+
#
|
12
|
+
# @param options [Hash] filter options
|
13
|
+
# @return [Array<Group>]
|
14
|
+
def filter(options={})
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Group] collection item class
|
19
|
+
def model
|
20
|
+
Group
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
# @return [Array<Group>]
|
26
|
+
def perform_population
|
27
|
+
api.group_all
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
File without changes
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
# Abstract compute API
|
6
|
+
class Compute < Types::Api
|
7
|
+
|
8
|
+
autoload :Server, 'miasma/models/compute/server'
|
9
|
+
autoload :Servers, 'miasma/models/compute/servers'
|
10
|
+
|
11
|
+
# All compute instances
|
12
|
+
#
|
13
|
+
# @return [Types::Collection<Models::Compute::Server>] servers
|
14
|
+
def servers
|
15
|
+
memoize(:servers) do
|
16
|
+
Servers.new(self)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Filtered compute instances
|
21
|
+
#
|
22
|
+
# @param filter [Hash] search filter
|
23
|
+
# @option filter [Symbol] :state state of server `Server::VALID_COMPUTE_STATES`
|
24
|
+
# @return [Array<Server>]
|
25
|
+
def server_filter(filter={})
|
26
|
+
end
|
27
|
+
|
28
|
+
# Create new server instance
|
29
|
+
#
|
30
|
+
# @param server [Models::Compute::Server]
|
31
|
+
# @return [Models::Compute::Server]
|
32
|
+
def server_save(server)
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
# Reload the server data from the API
|
37
|
+
#
|
38
|
+
# @param server [Models::Compute::Server]
|
39
|
+
# @return [Models::Compute::Server]
|
40
|
+
def server_reload(server)
|
41
|
+
raise NotImplementedError
|
42
|
+
end
|
43
|
+
|
44
|
+
# Delete server instance
|
45
|
+
#
|
46
|
+
# @param server [Models::Compute::Server]
|
47
|
+
# @return [TrueClass, FalseClass]
|
48
|
+
def server_destroy(server)
|
49
|
+
raise NotImplementedError
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return all servers
|
53
|
+
#
|
54
|
+
# @return [Array<Models::Compute::Server>]
|
55
|
+
def server_all
|
56
|
+
raise NotImplementedError
|
57
|
+
end
|
58
|
+
|
59
|
+
# Change server to desired state
|
60
|
+
#
|
61
|
+
# @param server [Models::Compute::Server]
|
62
|
+
# @param action [Symbol] :start, :stop, :restart
|
63
|
+
# @return [TrueClass, FalseClass]
|
64
|
+
def server_change_state(server, action)
|
65
|
+
raise NotImplementedError
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class Compute
|
6
|
+
# Abstract server
|
7
|
+
class Server < Types::Model
|
8
|
+
|
9
|
+
# @return [Array<Symbol>] valid compute instance states
|
10
|
+
VALID_COMPUTE_STATES = [:running, :stopped, :pending, :terminated]
|
11
|
+
|
12
|
+
# Data container for networks
|
13
|
+
#
|
14
|
+
# @todo add model link
|
15
|
+
class Network < Types::ThinModel
|
16
|
+
attribute :name, String
|
17
|
+
end
|
18
|
+
|
19
|
+
# Data container for IP addresses
|
20
|
+
class Address < Types::Data
|
21
|
+
attribute :version, Integer, :required => true, :default => 4
|
22
|
+
attribute :address, String, :required => true
|
23
|
+
attribute :label, String
|
24
|
+
end
|
25
|
+
|
26
|
+
attribute :name, String, :required => true
|
27
|
+
attribute :image_id, [String, Numeric], :required => true
|
28
|
+
attribute :flavor_id, [String, Numeric], :required => true
|
29
|
+
attribute :state, Symbol, :allowed => VALID_COMPUTE_STATES
|
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)}
|
34
|
+
attribute :personality, [Hash, String], :default => {}
|
35
|
+
attribute :metadata, Hash, :coerce => lambda{|o| o.to_smash}
|
36
|
+
attribute :key_name, String
|
37
|
+
|
38
|
+
# @return [Array<Smash>]
|
39
|
+
def addresses
|
40
|
+
addresses_public + addresses_private
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [String] public IP address
|
44
|
+
def address
|
45
|
+
obj = addresses_public.detect do |addr|
|
46
|
+
addr.version == 4
|
47
|
+
end
|
48
|
+
obj.address if obj
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
|
53
|
+
# Proxy save action up to the API
|
54
|
+
def perform_save
|
55
|
+
api.server_save(self)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Proxy reload action up to the API
|
59
|
+
def perform_reload
|
60
|
+
api.server_reload(self)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Proxy destroy action up to the API
|
64
|
+
def perform_destroy
|
65
|
+
api.server_destroy(self)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class Compute
|
6
|
+
|
7
|
+
# Abstract server collection
|
8
|
+
class Servers < Types::Collection
|
9
|
+
|
10
|
+
# Return servers matching given filter
|
11
|
+
#
|
12
|
+
# @param options [Hash] filter options
|
13
|
+
# @option options [String] :state current instance state
|
14
|
+
# @return [Array<Server>]
|
15
|
+
def filter(options={})
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Server] collection item class
|
20
|
+
def model
|
21
|
+
Server
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
# @return [Array<Server>]
|
27
|
+
def perform_population
|
28
|
+
api.server_all
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
# Abstract load balancer API
|
6
|
+
class LoadBalancer < Types::Api
|
7
|
+
|
8
|
+
autoload :Balancer, 'miasma/models/load_balancer/balancer'
|
9
|
+
autoload :Balancers, 'miasma/models/load_balancer/balancers'
|
10
|
+
|
11
|
+
# Load balancers
|
12
|
+
#
|
13
|
+
# @param filter [Hash] filtering options
|
14
|
+
# @return [Types::Collection<Models::LoadBalancer::Balancer>] auto scale groups
|
15
|
+
def balancers(filter={})
|
16
|
+
memoize(:balancers) do
|
17
|
+
Balancers.new(self)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Save load balancer
|
22
|
+
#
|
23
|
+
# @param balancer [Models::LoadBalancer::Balancer]
|
24
|
+
# @return [Models::LoadBalancer::Balancer]
|
25
|
+
def balancer_save(balancer)
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
# Reload the balancer data from the API
|
30
|
+
#
|
31
|
+
# @param balancer [Models::LoadBalancer::Balancer]
|
32
|
+
# @return [Models::LoadBalancer::Balancer]
|
33
|
+
def balancer_reload(balancer)
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
# Delete load balancer
|
38
|
+
#
|
39
|
+
# @param balancer [Models::LoadBalancer::Balancer]
|
40
|
+
# @return [TrueClass, FalseClass]
|
41
|
+
def balancer_destroy(balancer)
|
42
|
+
raise NotImplementedError
|
43
|
+
end
|
44
|
+
|
45
|
+
# Return all load balancers
|
46
|
+
#
|
47
|
+
# @param options [Hash] filter
|
48
|
+
# @return [Array<Models::LoadBalancer::Balancer>]
|
49
|
+
def balancer_all(options={})
|
50
|
+
raise NotImplementedError
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class LoadBalancer
|
6
|
+
# Abstract balancer
|
7
|
+
class Balancer < Types::Model
|
8
|
+
|
9
|
+
class Server < Types::ThinModel
|
10
|
+
model Miasma::Models::Compute::Server
|
11
|
+
end
|
12
|
+
|
13
|
+
class Address < Types::Data
|
14
|
+
attribute :address, String, :required => true
|
15
|
+
attribute :version, Integer, :default => 4
|
16
|
+
end
|
17
|
+
|
18
|
+
class HealthCheck < Types::Data
|
19
|
+
attribute :interval, Integer
|
20
|
+
attribute :target, String, :required => true
|
21
|
+
attribute :healthy_threshold, Integer
|
22
|
+
attribute :unhealthy_threshold, Integer
|
23
|
+
attribute :timeout, Integer
|
24
|
+
end
|
25
|
+
|
26
|
+
class Listener < Types::Data
|
27
|
+
attribute :protocol, String, :required => true
|
28
|
+
attribute :load_balancer_port, Integer, :required => true
|
29
|
+
attribute :instance_protocol, String, :required => true
|
30
|
+
attribute :instance_port, Integer, :required => true
|
31
|
+
attribute :ssl_certificate_id, [Integer, String]
|
32
|
+
end
|
33
|
+
|
34
|
+
attribute :name, String
|
35
|
+
attribute :state, Symbol, :allowed_values => [:active, :pending]
|
36
|
+
attribute :status, String
|
37
|
+
attribute :servers, Server, :multiple => true, :coerce => lambda{|v| Server.new(v)}
|
38
|
+
attribute :public_addresses, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
39
|
+
attribute :private_addresses, Address, :multiple => true, :coerce => lambda{|v| Address.new(v)}
|
40
|
+
attribute :health_check, HealthCheck, :coerce => lambda{|v| HealthCheck.new(v)}
|
41
|
+
attribute :listeners, Listener, :coerce => lambda{|v| Listener.new(v)}, :multiple => true
|
42
|
+
attribute :created, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
43
|
+
attribute :updated, Time, :coerce => lambda{|v| Time.parse(v.to_s)}
|
44
|
+
|
45
|
+
on_missing :reload
|
46
|
+
|
47
|
+
# @return [Array<Address>] all addresses
|
48
|
+
def addresses
|
49
|
+
public_addresses + private_addresses
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
# Proxy save action up to the API
|
55
|
+
def perform_save
|
56
|
+
api.balancer_save(self)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Proxy reload action up to the API
|
60
|
+
def perform_reload
|
61
|
+
api.balancer_reload(self)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Proxy destroy action up to the API
|
65
|
+
def perform_destroy
|
66
|
+
api.balancer_destroy(self)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
class LoadBalancer
|
6
|
+
|
7
|
+
# Abstract load balancer collection
|
8
|
+
class Balancers < Types::Collection
|
9
|
+
|
10
|
+
# Return load balancers matching given filter
|
11
|
+
#
|
12
|
+
# @param options [Hash] filter options
|
13
|
+
# @return [Array<Balancer>]
|
14
|
+
def filter(options={})
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Balancer] collection item class
|
19
|
+
def model
|
20
|
+
Balancer
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
# @return [Array<Balancer>]
|
26
|
+
def perform_population
|
27
|
+
api.balancer_all
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
File without changes
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'miasma'
|
2
|
+
|
3
|
+
module Miasma
|
4
|
+
module Models
|
5
|
+
# Abstract orchestration API
|
6
|
+
class Orchestration < Types::Api
|
7
|
+
|
8
|
+
autoload :Stack, 'miasma/models/orchestration/stack'
|
9
|
+
autoload :Stacks, 'miasma/models/orchestration/stacks'
|
10
|
+
|
11
|
+
# @return [Smash] mapping of remote type to internal type
|
12
|
+
RESOURCE_MAPPING = Smash.new
|
13
|
+
|
14
|
+
## mapping example
|
15
|
+
# RESOURCE_MAPPING = Smash.new(
|
16
|
+
# 'AWS::EC2::Instance' => Miasma::Models::Compute::Server
|
17
|
+
# )
|
18
|
+
|
19
|
+
# @return [Array<Symbol>] valid resource states
|
20
|
+
VALID_RESOURCE_STATES = [:create_complete, :create_in_progress, :create_failed,
|
21
|
+
:delete_complete, :delete_in_progress, :delete_failed,
|
22
|
+
:rollback_complete, :rollback_in_progress, :rollback_failed,
|
23
|
+
:update_complete, :update_in_progress, :update_failed,
|
24
|
+
:update_rollback_complete, :update_rollback_in_progress, :update_rollback_failed
|
25
|
+
]
|
26
|
+
|
27
|
+
# Orchestration stacks
|
28
|
+
#
|
29
|
+
# @param filter [Hash] filtering options
|
30
|
+
# @return [Types::Collection<Models::Orchestration::Stack>] stacks
|
31
|
+
def stacks(args={})
|
32
|
+
memoize(:stacks) do
|
33
|
+
Stacks.new(self)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Save the stack
|
38
|
+
#
|
39
|
+
# @param stack [Models::Orchestration::Stack]
|
40
|
+
# @return [Models::Orchestration::Stack]
|
41
|
+
def stack_save(stack)
|
42
|
+
raise NotImplementedError
|
43
|
+
end
|
44
|
+
|
45
|
+
# Reload the stack data from the API
|
46
|
+
#
|
47
|
+
# @param stack [Models::Orchestration::Stack]
|
48
|
+
# @return [Models::Orchestration::Stack]
|
49
|
+
def stack_reload(stack)
|
50
|
+
raise NotImplementedError
|
51
|
+
end
|
52
|
+
|
53
|
+
# Delete the stack
|
54
|
+
#
|
55
|
+
# @param stack [Models::Orchestration::Stack]
|
56
|
+
# @return [TrueClass, FalseClass]
|
57
|
+
def stack_destroy(stack)
|
58
|
+
raise NotImplementedError
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return all stacks
|
62
|
+
#
|
63
|
+
# @param options [Hash] filter
|
64
|
+
# @return [Array<Models::Orchestration::Stack>]
|
65
|
+
def stack_all(options={})
|
66
|
+
raise NotImplementedError
|
67
|
+
end
|
68
|
+
|
69
|
+
# Fetch stack template
|
70
|
+
#
|
71
|
+
# @param stack [Stack]
|
72
|
+
# @return [Smash] stack template
|
73
|
+
def stack_template_load(stack)
|
74
|
+
raise NotImplementedError
|
75
|
+
end
|
76
|
+
|
77
|
+
# Validate stack template
|
78
|
+
#
|
79
|
+
# @param stack [Stack]
|
80
|
+
# @return [NilClass, String] nil if valid, string error message if invalid
|
81
|
+
def stack_template_validate(stack)
|
82
|
+
raise NotImplementedError
|
83
|
+
end
|
84
|
+
|
85
|
+
# Return all resources for stack
|
86
|
+
#
|
87
|
+
# @param stack [Models::Orchestration::Stack]
|
88
|
+
# @return [Array<Models::Orchestration::Stack::Resource>]
|
89
|
+
def resource_all(stack)
|
90
|
+
raise NotImplementedError
|
91
|
+
end
|
92
|
+
|
93
|
+
# Reload the stack resource data from the API
|
94
|
+
#
|
95
|
+
# @param resource [Models::Orchestration::Stack::Resource]
|
96
|
+
# @return [Models::Orchestration::Resource]
|
97
|
+
def resource_reload(resource)
|
98
|
+
raise NotImplementedError
|
99
|
+
end
|
100
|
+
|
101
|
+
# Return all events for stack
|
102
|
+
#
|
103
|
+
# @param stack [Models::Orchestration::Stack]
|
104
|
+
# @return [Array<Models::Orchestration::Stack::Event>]
|
105
|
+
def event_all(stack)
|
106
|
+
raise NotImplementedError
|
107
|
+
end
|
108
|
+
|
109
|
+
# Return all new events for event collection
|
110
|
+
#
|
111
|
+
# @param events [Models::Orchestration::Stack::Events]
|
112
|
+
# @return [Array<Models::Orchestration::Stack::Event>]
|
113
|
+
def event_all_new(events)
|
114
|
+
raise NotImplementedError
|
115
|
+
end
|
116
|
+
|
117
|
+
# Reload the stack event data from the API
|
118
|
+
#
|
119
|
+
# @param resource [Models::Orchestration::Stack::Event]
|
120
|
+
# @return [Models::Orchestration::Event]
|
121
|
+
def event_reload(event)
|
122
|
+
raise NotImplementedError
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|