miasma 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -0
  3. data/README.md +179 -0
  4. data/lib/miasma.rb +52 -0
  5. data/lib/miasma/contrib/aws.rb +390 -0
  6. data/lib/miasma/contrib/aws/auto_scale.rb +85 -0
  7. data/lib/miasma/contrib/aws/compute.rb +112 -0
  8. data/lib/miasma/contrib/aws/load_balancer.rb +185 -0
  9. data/lib/miasma/contrib/aws/orchestration.rb +338 -0
  10. data/lib/miasma/contrib/rackspace.rb +164 -0
  11. data/lib/miasma/contrib/rackspace/auto_scale.rb +84 -0
  12. data/lib/miasma/contrib/rackspace/compute.rb +104 -0
  13. data/lib/miasma/contrib/rackspace/load_balancer.rb +117 -0
  14. data/lib/miasma/contrib/rackspace/orchestration.rb +255 -0
  15. data/lib/miasma/error.rb +89 -0
  16. data/lib/miasma/models.rb +14 -0
  17. data/lib/miasma/models/auto_scale.rb +55 -0
  18. data/lib/miasma/models/auto_scale/group.rb +64 -0
  19. data/lib/miasma/models/auto_scale/groups.rb +34 -0
  20. data/lib/miasma/models/block_storage.rb +0 -0
  21. data/lib/miasma/models/compute.rb +70 -0
  22. data/lib/miasma/models/compute/server.rb +71 -0
  23. data/lib/miasma/models/compute/servers.rb +35 -0
  24. data/lib/miasma/models/dns.rb +0 -0
  25. data/lib/miasma/models/load_balancer.rb +55 -0
  26. data/lib/miasma/models/load_balancer/balancer.rb +72 -0
  27. data/lib/miasma/models/load_balancer/balancers.rb +34 -0
  28. data/lib/miasma/models/monitoring.rb +0 -0
  29. data/lib/miasma/models/orchestration.rb +127 -0
  30. data/lib/miasma/models/orchestration/event.rb +38 -0
  31. data/lib/miasma/models/orchestration/events.rb +64 -0
  32. data/lib/miasma/models/orchestration/resource.rb +79 -0
  33. data/lib/miasma/models/orchestration/resources.rb +55 -0
  34. data/lib/miasma/models/orchestration/stack.rb +144 -0
  35. data/lib/miasma/models/orchestration/stacks.rb +46 -0
  36. data/lib/miasma/models/queues.rb +0 -0
  37. data/lib/miasma/models/storage.rb +60 -0
  38. data/lib/miasma/models/storage/bucket.rb +36 -0
  39. data/lib/miasma/models/storage/buckets.rb +41 -0
  40. data/lib/miasma/models/storage/file.rb +45 -0
  41. data/lib/miasma/models/storage/files.rb +52 -0
  42. data/lib/miasma/types.rb +13 -0
  43. data/lib/miasma/types/api.rb +145 -0
  44. data/lib/miasma/types/collection.rb +116 -0
  45. data/lib/miasma/types/data.rb +53 -0
  46. data/lib/miasma/types/model.rb +118 -0
  47. data/lib/miasma/types/thin_model.rb +76 -0
  48. data/lib/miasma/utils.rb +12 -0
  49. data/lib/miasma/utils/animal_strings.rb +29 -0
  50. data/lib/miasma/utils/immutable.rb +36 -0
  51. data/lib/miasma/utils/lazy.rb +231 -0
  52. data/lib/miasma/utils/memoization.rb +55 -0
  53. data/lib/miasma/utils/smash.rb +149 -0
  54. data/lib/miasma/version.rb +4 -0
  55. data/miasma.gemspec +18 -0
  56. 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