cloud_powers 0.2.7.23 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.test.env.example +6 -6
- data/.travis.yml +1 -1
- data/README +190 -0
- data/cloud_powers.gemspec +4 -4
- data/lib/cloud_powers.rb +3 -13
- data/lib/cloud_powers/aws_resources.rb +21 -4
- data/lib/cloud_powers/creatable.rb +122 -0
- data/lib/cloud_powers/helpers.rb +58 -0
- data/lib/cloud_powers/helpers/lang_help.rb +288 -0
- data/lib/cloud_powers/helpers/logic_help.rb +152 -0
- data/lib/cloud_powers/helpers/path_help.rb +90 -0
- data/lib/cloud_powers/node.rb +69 -68
- data/lib/cloud_powers/node/instance.rb +52 -0
- data/lib/cloud_powers/resource.rb +44 -0
- data/lib/cloud_powers/storage.rb +27 -14
- data/lib/{stubs → cloud_powers/stubs}/aws_stubs.rb +37 -14
- data/lib/cloud_powers/synapse/broadcast.rb +117 -0
- data/lib/cloud_powers/synapse/broadcast/channel.rb +44 -0
- data/lib/cloud_powers/synapse/pipe.rb +211 -0
- data/lib/cloud_powers/synapse/pipe/stream.rb +41 -0
- data/lib/cloud_powers/synapse/queue.rb +357 -0
- data/lib/cloud_powers/synapse/queue/board.rb +61 -95
- data/lib/cloud_powers/synapse/queue/poller.rb +29 -0
- data/lib/cloud_powers/synapse/synapse.rb +10 -12
- data/lib/cloud_powers/synapse/web_soc.rb +13 -0
- data/lib/cloud_powers/synapse/web_soc/soc_client.rb +52 -0
- data/lib/cloud_powers/synapse/web_soc/soc_server.rb +48 -0
- data/lib/cloud_powers/version.rb +1 -1
- data/lib/cloud_powers/zenv.rb +13 -12
- metadata +24 -13
- data/lib/cloud_powers/context.rb +0 -275
- data/lib/cloud_powers/delegator.rb +0 -113
- data/lib/cloud_powers/helper.rb +0 -453
- data/lib/cloud_powers/synapse/websocket/websocclient.rb +0 -53
- data/lib/cloud_powers/synapse/websocket/websocserver.rb +0 -46
- data/lib/cloud_powers/workflow_factory.rb +0 -160
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'websocket-eventmachine-client'
|
2
|
-
|
3
|
-
module Smash
|
4
|
-
module CloudPowers
|
5
|
-
module Synapse
|
6
|
-
module WebSocClient
|
7
|
-
|
8
|
-
def create_websoc_client(opts = {})
|
9
|
-
ws = {}
|
10
|
-
Thread.new(ws) do
|
11
|
-
EM.run do
|
12
|
-
ws = WebSocket::EventMachine::Client.connect(:uri => 'ws://' + opts[:host] + ':' + opts[:port])
|
13
|
-
|
14
|
-
client_name = opts[:client] || 'default_client'
|
15
|
-
|
16
|
-
instance_variable_set(:"@#{client_name}",ws)
|
17
|
-
|
18
|
-
open_callback = opts[:on_open] || Proc.new do
|
19
|
-
puts "Connected"
|
20
|
-
end
|
21
|
-
|
22
|
-
ws.onopen &open_callback
|
23
|
-
|
24
|
-
on_message_callback = opts[:on_message] || Proc.new do |msg, type|
|
25
|
-
puts "Received message: #{msg}"
|
26
|
-
end
|
27
|
-
|
28
|
-
ws.onmessage &on_message_callback
|
29
|
-
|
30
|
-
on_error_callback = opts[:on_error] || Proc.new do |error|
|
31
|
-
puts "Error ==> #{error}"
|
32
|
-
end
|
33
|
-
|
34
|
-
ws.onerror &on_error_callback
|
35
|
-
|
36
|
-
on_close_callback = opts[:on_close] || Proc.new do |code, reason|
|
37
|
-
puts "Disconnected with status code: #{code}"
|
38
|
-
puts "Disconnected with status message: #{reason}"
|
39
|
-
end
|
40
|
-
|
41
|
-
ws.onclose &on_close_callback
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'websocket-eventmachine-server'
|
2
|
-
module Smash
|
3
|
-
module CloudPowers
|
4
|
-
module Synapse
|
5
|
-
module WebSocServer
|
6
|
-
def create_websoc_server(opts = {})
|
7
|
-
channel = opts[:channel] || EM::Channel.new
|
8
|
-
Thread.new do
|
9
|
-
EM.run do
|
10
|
-
WebSocket::EventMachine::Server.start(:host => opts[:host], :port => opts[:port]) do |ws|
|
11
|
-
sid = nil
|
12
|
-
|
13
|
-
open_callback = opts[:on_open] || Proc.new do
|
14
|
-
puts "Client connected"
|
15
|
-
sid = channel.subscribe { |msg| ws.send msg }
|
16
|
-
end
|
17
|
-
ws.onopen &open_callback
|
18
|
-
|
19
|
-
on_message_callback = opts[:on_message] || Proc.new do |msg, type|
|
20
|
-
@current_websocket_message = msg
|
21
|
-
end
|
22
|
-
ws.onmessage &on_message_callback
|
23
|
-
|
24
|
-
on_error_callback = opts[:on_error] || Proc.new do |error|
|
25
|
-
puts "Error occured: #{error}"
|
26
|
-
end
|
27
|
-
ws.onerror &on_error_callback
|
28
|
-
|
29
|
-
on_close_callback = opts[:on_close] || Proc.new do
|
30
|
-
puts "Client disconnected"
|
31
|
-
channel.unsubscribe(sid) unless channel.nil?
|
32
|
-
end
|
33
|
-
ws.onclose &on_close_callback
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
channel
|
38
|
-
end
|
39
|
-
|
40
|
-
def broadcast_message(channel, msg)
|
41
|
-
channel.push msg
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,160 +0,0 @@
|
|
1
|
-
require 'workflow'
|
2
|
-
|
3
|
-
module Smash
|
4
|
-
module CloudPowers
|
5
|
-
# The WorkflowFactory module provides you with a custom, embeddable workflow
|
6
|
-
# for classes. To do this, it takes a description of the workflow, in
|
7
|
-
# the form of a <tt>Hash</tt> and injects it into the class' Singleton/Eigan
|
8
|
-
# class. It uses the +workflow+ gem to handle the workflow stuff for now
|
9
|
-
# but after MVP, this will be a roll-our-own implementation, to cut down on
|
10
|
-
# all dependencies possible.
|
11
|
-
module WorkflowFactory
|
12
|
-
# This is the method responsible for injecting the workflow on the instance
|
13
|
-
# it is called on. After this method is called on an instance of some class,
|
14
|
-
# you can then access any of the described states as methods on that instance.
|
15
|
-
#
|
16
|
-
# Parameters
|
17
|
-
# * description +Hash+ - Describe the workflow you want to use. The format
|
18
|
-
# follows the actual Workflow Specification(s) from the gem that you would
|
19
|
-
# normally write onto the class like normal.
|
20
|
-
#
|
21
|
-
# * Example +description+ +Hash+
|
22
|
-
# * * this description would give you a workflow that starts in the +new+
|
23
|
-
# state and when the <tt>#build!()</tt> method was called on the object
|
24
|
-
# that has this workflow, the state would transition into the +building+
|
25
|
-
# state. The workflow would then listen for the <tt>run!()</tt> method
|
26
|
-
# call, which would progress the state to the +in_progress+ state. Next,
|
27
|
-
# the workflow would listen for the <tt>post_results!()</tt> method
|
28
|
-
# call. When someone or something calls it, the state will progress to
|
29
|
-
# the final state, +done+, from which no more workflow stuff will happen.
|
30
|
-
#
|
31
|
-
# description = {
|
32
|
-
# workflow: {
|
33
|
-
# states: [
|
34
|
-
# { new: { event: :build, transitions_to: :building } },
|
35
|
-
# { building: { event: :run, transitions_to: :in_progress } },
|
36
|
-
# { in_progress: { event: :post_results, transitions_to: :done } },
|
37
|
-
# { done: nil }
|
38
|
-
# ]
|
39
|
-
# }
|
40
|
-
# }
|
41
|
-
#
|
42
|
-
# Returns
|
43
|
-
# * +nil+
|
44
|
-
#
|
45
|
-
# Example
|
46
|
-
# * build the workflow using the description from above
|
47
|
-
# class Job
|
48
|
-
# # code code code...
|
49
|
-
# def insert_my_workflow(description)
|
50
|
-
# class << build_workflow(description)
|
51
|
-
# end
|
52
|
-
# end
|
53
|
-
#
|
54
|
-
# Which would yield this workflow, from the Workflow gem
|
55
|
-
#
|
56
|
-
# class Job
|
57
|
-
# # all the commented lines below are what `WorkflowFactory#inject_workflow()`
|
58
|
-
# # did for you. These lines don't need to actually be in your class.
|
59
|
-
#
|
60
|
-
# # include Workflow
|
61
|
-
# #
|
62
|
-
# # workflow do
|
63
|
-
# # state :new do
|
64
|
-
# # event :build, :transitions_to => :building
|
65
|
-
# # end
|
66
|
-
# # state :building do
|
67
|
-
# # event :run, :transitions_to => :in_progress
|
68
|
-
# # end
|
69
|
-
# # state :in_progress do
|
70
|
-
# # event :post_results, :transitions_to => :done
|
71
|
-
# # end
|
72
|
-
# # state :done
|
73
|
-
# # end
|
74
|
-
# end
|
75
|
-
#
|
76
|
-
# job = Job.new
|
77
|
-
# # => #<Job:0x007fdaba8956b0>
|
78
|
-
# job.done?
|
79
|
-
# # => NoMethodError
|
80
|
-
# job.insert_workflow(description)
|
81
|
-
# # => nil
|
82
|
-
# job.done?
|
83
|
-
# # => false
|
84
|
-
# job.current_state
|
85
|
-
# # => :building
|
86
|
-
#
|
87
|
-
# Notes
|
88
|
-
# * See <tt>description_to_s()</tt>
|
89
|
-
# * TODO: There has got to be a better way, so if any of you have suggestions...
|
90
|
-
# The fact that the eval gets evaluated and invoked in the workflow gem
|
91
|
-
# is of little comfort, despite how nice the gem is. Long story short,
|
92
|
-
# be comfortable with what you're doing.
|
93
|
-
# * see the workflow gem docs and question me if you want some nice ways
|
94
|
-
# to really use this module. {workflow homepage}[https://github.com/geekq/workflow]
|
95
|
-
def inject_workflow(description)
|
96
|
-
workflow_spec_string = description_to_s(description)
|
97
|
-
begin
|
98
|
-
self.class.class_eval(workflow_spec_string)
|
99
|
-
define_singleton_method(:has_workflow?) { true }
|
100
|
-
rescue Exception => e
|
101
|
-
define_singleton_method(:has_workflow?) { !!(puts e.backtrace) }
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Takes a description and turns it into a string that would describe the
|
106
|
-
# workflow you want to insert.
|
107
|
-
#
|
108
|
-
# Parameters
|
109
|
-
# * +description+ +Hash+ - of the format
|
110
|
-
# {
|
111
|
-
# workflow: {
|
112
|
-
# states: [
|
113
|
-
# { state_name: { event: :event_name, transitions_to: :transition_to_name } },
|
114
|
-
# { state_name: nil }
|
115
|
-
# ]
|
116
|
-
# }
|
117
|
-
# }
|
118
|
-
#
|
119
|
-
# Returns
|
120
|
-
# +String+
|
121
|
-
#
|
122
|
-
# Example
|
123
|
-
# # given the description seen in <tt>inject_workflow()</tt>
|
124
|
-
# puts description_to_s(description)
|
125
|
-
# # =>
|
126
|
-
# workflow do
|
127
|
-
# state :new do
|
128
|
-
# event :build, :transitions_to => :building
|
129
|
-
# end
|
130
|
-
# state :building do
|
131
|
-
# event :run, :transitions_to => :in_progress
|
132
|
-
# end
|
133
|
-
# state :in_progress do
|
134
|
-
# event :post_results, :transitions_to => :done
|
135
|
-
# end
|
136
|
-
# state :done
|
137
|
-
# end
|
138
|
-
# Notes
|
139
|
-
# * See <tt>inject_workflow()</tt>
|
140
|
-
def description_to_s(description)
|
141
|
-
description_string_builder = ['include Workflow', 'workflow do']
|
142
|
-
description[:workflow][:states].each do |state|
|
143
|
-
state.map do |name, state_description|
|
144
|
-
if state_description.nil? # if this is a final state...
|
145
|
-
description_string_builder << "state :#{name}"
|
146
|
-
else # because it is not a final state, add event information too.
|
147
|
-
description_string_builder.concat([
|
148
|
-
"state :#{name} do",
|
149
|
-
"event :#{state_description[:event]}, transitions_to: :#{state_description[:transitions_to]}",
|
150
|
-
"end"
|
151
|
-
])
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
description_string_builder << "end\n"
|
156
|
-
description_string_builder.join("\n")
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|