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.
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