miasma 0.0.1 → 0.1.0
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.
- 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
|