cuboid 0.0.0 → 0.0.1alpha
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 +0 -0
- data/Gemfile +20 -5
- data/LICENSE.md +22 -0
- data/README.md +158 -19
- data/Rakefile +56 -3
- data/config/paths.yml +15 -0
- data/cuboid.gemspec +61 -23
- data/lib/cuboid.rb +96 -4
- data/lib/cuboid/application.rb +326 -0
- data/lib/cuboid/application/parts/data.rb +18 -0
- data/lib/cuboid/application/parts/report.rb +29 -0
- data/lib/cuboid/application/parts/state.rb +274 -0
- data/lib/cuboid/application/runtime.rb +25 -0
- data/lib/cuboid/banner.rb +13 -0
- data/lib/cuboid/data.rb +86 -0
- data/lib/cuboid/data/application.rb +52 -0
- data/lib/cuboid/error.rb +9 -0
- data/lib/cuboid/option_group.rb +129 -0
- data/lib/cuboid/option_groups.rb +8 -0
- data/lib/cuboid/option_groups/datastore.rb +23 -0
- data/lib/cuboid/option_groups/dispatcher.rb +38 -0
- data/lib/cuboid/option_groups/output.rb +14 -0
- data/lib/cuboid/option_groups/paths.rb +184 -0
- data/lib/cuboid/option_groups/report.rb +39 -0
- data/lib/cuboid/option_groups/rpc.rb +105 -0
- data/lib/cuboid/option_groups/scheduler.rb +27 -0
- data/lib/cuboid/option_groups/snapshot.rb +13 -0
- data/lib/cuboid/option_groups/system.rb +10 -0
- data/lib/cuboid/options.rb +254 -0
- data/lib/cuboid/processes.rb +13 -0
- data/lib/cuboid/processes/dispatchers.rb +140 -0
- data/lib/cuboid/processes/executables/base.rb +54 -0
- data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
- data/lib/cuboid/processes/executables/instance.rb +12 -0
- data/lib/cuboid/processes/executables/rest_service.rb +13 -0
- data/lib/cuboid/processes/executables/scheduler.rb +5 -0
- data/lib/cuboid/processes/helpers.rb +4 -0
- data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
- data/lib/cuboid/processes/helpers/instances.rb +39 -0
- data/lib/cuboid/processes/helpers/processes.rb +23 -0
- data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
- data/lib/cuboid/processes/instances.rb +203 -0
- data/lib/cuboid/processes/manager.rb +262 -0
- data/lib/cuboid/processes/schedulers.rb +128 -0
- data/lib/cuboid/report.rb +220 -0
- data/lib/cuboid/rest/server.rb +165 -0
- data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
- data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
- data/lib/cuboid/rest/server/routes/grid.rb +41 -0
- data/lib/cuboid/rest/server/routes/instances.rb +131 -0
- data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
- data/lib/cuboid/rpc/client.rb +3 -0
- data/lib/cuboid/rpc/client/base.rb +58 -0
- data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
- data/lib/cuboid/rpc/client/instance.rb +100 -0
- data/lib/cuboid/rpc/client/instance/service.rb +37 -0
- data/lib/cuboid/rpc/client/scheduler.rb +46 -0
- data/lib/cuboid/rpc/serializer.rb +92 -0
- data/lib/cuboid/rpc/server/active_options.rb +38 -0
- data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
- data/lib/cuboid/rpc/server/base.rb +63 -0
- data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
- data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
- data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
- data/lib/cuboid/rpc/server/instance.rb +338 -0
- data/lib/cuboid/rpc/server/output.rb +92 -0
- data/lib/cuboid/rpc/server/scheduler.rb +482 -0
- data/lib/cuboid/ruby.rb +4 -0
- data/lib/cuboid/ruby/array.rb +17 -0
- data/lib/cuboid/ruby/hash.rb +41 -0
- data/lib/cuboid/ruby/object.rb +32 -0
- data/lib/cuboid/snapshot.rb +186 -0
- data/lib/cuboid/state.rb +94 -0
- data/lib/cuboid/state/application.rb +309 -0
- data/lib/cuboid/state/options.rb +27 -0
- data/lib/cuboid/support.rb +11 -0
- data/lib/cuboid/support/buffer.rb +3 -0
- data/lib/cuboid/support/buffer/autoflush.rb +61 -0
- data/lib/cuboid/support/buffer/base.rb +91 -0
- data/lib/cuboid/support/cache.rb +7 -0
- data/lib/cuboid/support/cache/base.rb +226 -0
- data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
- data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
- data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
- data/lib/cuboid/support/cache/preference.rb +31 -0
- data/lib/cuboid/support/cache/random_replacement.rb +20 -0
- data/lib/cuboid/support/crypto.rb +2 -0
- data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
- data/lib/cuboid/support/database.rb +5 -0
- data/lib/cuboid/support/database/base.rb +177 -0
- data/lib/cuboid/support/database/categorized_queue.rb +195 -0
- data/lib/cuboid/support/database/hash.rb +300 -0
- data/lib/cuboid/support/database/queue.rb +149 -0
- data/lib/cuboid/support/filter.rb +3 -0
- data/lib/cuboid/support/filter/base.rb +110 -0
- data/lib/cuboid/support/filter/set.rb +29 -0
- data/lib/cuboid/support/glob.rb +27 -0
- data/lib/cuboid/support/mixins.rb +8 -0
- data/lib/cuboid/support/mixins/observable.rb +99 -0
- data/lib/cuboid/support/mixins/parts.rb +20 -0
- data/lib/cuboid/support/mixins/profiler.rb +93 -0
- data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
- data/lib/cuboid/support/mixins/terminal.rb +57 -0
- data/lib/cuboid/system.rb +119 -0
- data/lib/cuboid/system/platforms.rb +84 -0
- data/lib/cuboid/system/platforms/linux.rb +26 -0
- data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
- data/lib/cuboid/system/platforms/osx.rb +25 -0
- data/lib/cuboid/system/platforms/windows.rb +81 -0
- data/lib/cuboid/system/slots.rb +143 -0
- data/lib/cuboid/ui/output.rb +52 -0
- data/lib/cuboid/ui/output_interface.rb +43 -0
- data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
- data/lib/cuboid/ui/output_interface/controls.rb +84 -0
- data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
- data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
- data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
- data/lib/cuboid/utilities.rb +155 -0
- data/lib/cuboid/version.rb +4 -3
- data/lib/version +1 -0
- data/logs/placeholder +0 -0
- data/spec/cuboid/application/parts/data_spec.rb +12 -0
- data/spec/cuboid/application/parts/report_spec.rb +6 -0
- data/spec/cuboid/application/parts/state_spec.rb +192 -0
- data/spec/cuboid/application/runtime_spec.rb +21 -0
- data/spec/cuboid/application_spec.rb +37 -0
- data/spec/cuboid/data/application_spec.rb +22 -0
- data/spec/cuboid/data_spec.rb +47 -0
- data/spec/cuboid/error_spec.rb +23 -0
- data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
- data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
- data/spec/cuboid/option_groups/output_spec.rb +11 -0
- data/spec/cuboid/option_groups/paths_spec.rb +184 -0
- data/spec/cuboid/option_groups/report_spec.rb +26 -0
- data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
- data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
- data/spec/cuboid/option_groups/system.rb +12 -0
- data/spec/cuboid/options_spec.rb +218 -0
- data/spec/cuboid/report_spec.rb +221 -0
- data/spec/cuboid/rest/server_spec.rb +1205 -0
- data/spec/cuboid/rpc/client/base_spec.rb +151 -0
- data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
- data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
- data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
- data/spec/cuboid/rpc/server/base_spec.rb +60 -0
- data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
- data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
- data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
- data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
- data/spec/cuboid/rpc/server/output_spec.rb +32 -0
- data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
- data/spec/cuboid/ruby/array_spec.rb +77 -0
- data/spec/cuboid/ruby/hash_spec.rb +63 -0
- data/spec/cuboid/ruby/object_spec.rb +22 -0
- data/spec/cuboid/snapshot_spec.rb +123 -0
- data/spec/cuboid/state/application_spec.rb +538 -0
- data/spec/cuboid/state/options_spec.rb +37 -0
- data/spec/cuboid/state_spec.rb +53 -0
- data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
- data/spec/cuboid/support/buffer/base_spec.rb +193 -0
- data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
- data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
- data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
- data/spec/cuboid/support/cache/preference_spec.rb +37 -0
- data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
- data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
- data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
- data/spec/cuboid/support/database/hash_spec.rb +204 -0
- data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
- data/spec/cuboid/support/filter/set_spec.rb +19 -0
- data/spec/cuboid/support/glob_spec.rb +75 -0
- data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
- data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
- data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
- data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
- data/spec/cuboid/system/slots_spec.rb +202 -0
- data/spec/cuboid/system_spec.rb +105 -0
- data/spec/cuboid/utilities_spec.rb +131 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/factories/placeholder +0 -0
- data/spec/support/factories/scan_report.rb +18 -0
- data/spec/support/fixtures/empty/placeholder +0 -0
- data/spec/support/fixtures/executables/node.rb +50 -0
- data/spec/support/fixtures/mock_app.rb +61 -0
- data/spec/support/fixtures/mock_app/test_service.rb +64 -0
- data/spec/support/fixtures/services/echo.rb +64 -0
- data/spec/support/helpers/framework.rb +3 -0
- data/spec/support/helpers/matchers.rb +5 -0
- data/spec/support/helpers/misc.rb +3 -0
- data/spec/support/helpers/paths.rb +15 -0
- data/spec/support/helpers/request_helpers.rb +38 -0
- data/spec/support/helpers/requires.rb +8 -0
- data/spec/support/helpers/resets.rb +52 -0
- data/spec/support/helpers/web_server.rb +15 -0
- data/spec/support/lib/factory.rb +107 -0
- data/spec/support/lib/web_server_client.rb +41 -0
- data/spec/support/lib/web_server_dispatcher.rb +25 -0
- data/spec/support/lib/web_server_manager.rb +118 -0
- data/spec/support/logs/placeholder +0 -0
- data/spec/support/pems/cacert.pem +37 -0
- data/spec/support/pems/client/cert.pem +37 -0
- data/spec/support/pems/client/foo-cert.pem +39 -0
- data/spec/support/pems/client/foo-key.pem +51 -0
- data/spec/support/pems/client/key.pem +51 -0
- data/spec/support/pems/server/cert.pem +37 -0
- data/spec/support/pems/server/key.pem +51 -0
- data/spec/support/reports/placeholder +0 -0
- data/spec/support/shared/application.rb +10 -0
- data/spec/support/shared/component.rb +31 -0
- data/spec/support/shared/component/options/base.rb +187 -0
- data/spec/support/shared/option_group.rb +98 -0
- data/spec/support/shared/support/cache.rb +419 -0
- data/spec/support/shared/support/filter.rb +143 -0
- data/spec/support/shared/system/platforms/base.rb +25 -0
- data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
- data/spec/support/snapshots/placeholder +0 -0
- metadata +566 -21
- data/.gitignore +0 -8
- data/bin/console +0 -15
- data/bin/setup +0 -8
@@ -0,0 +1,25 @@
|
|
1
|
+
module Cuboid
|
2
|
+
class Application
|
3
|
+
|
4
|
+
class Runtime
|
5
|
+
|
6
|
+
def state
|
7
|
+
Cuboid::Application.application.state.runtime
|
8
|
+
end
|
9
|
+
|
10
|
+
def state=( d )
|
11
|
+
Cuboid::Application.application.state.runtime = d
|
12
|
+
end
|
13
|
+
|
14
|
+
def data
|
15
|
+
Cuboid::Application.application.data.runtime
|
16
|
+
end
|
17
|
+
|
18
|
+
def data=( d )
|
19
|
+
Cuboid::Application.application.data.runtime = d
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/cuboid/data.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
# Stores and provides access to the data of the system.
|
4
|
+
#
|
5
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
6
|
+
class Data
|
7
|
+
|
8
|
+
# {Data} error namespace.
|
9
|
+
#
|
10
|
+
# All {Data} errors inherit from and live under it.
|
11
|
+
#
|
12
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
13
|
+
class Error < Cuboid::Error
|
14
|
+
end
|
15
|
+
|
16
|
+
require_relative 'data/application'
|
17
|
+
|
18
|
+
class <<self
|
19
|
+
|
20
|
+
# @return [Framework]
|
21
|
+
attr_accessor :application
|
22
|
+
|
23
|
+
def reset
|
24
|
+
@application = Application.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def statistics
|
28
|
+
stats = {}
|
29
|
+
each do |attribute|
|
30
|
+
stats[attribute] = send(attribute).statistics
|
31
|
+
end
|
32
|
+
stats
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param [String] directory
|
36
|
+
# Location of the dump directory.
|
37
|
+
# @return [String]
|
38
|
+
# Location of the dump directory.
|
39
|
+
def dump( directory )
|
40
|
+
FileUtils.mkdir_p( directory )
|
41
|
+
|
42
|
+
each do |name, state|
|
43
|
+
state.dump( "#{directory}/#{name}/" )
|
44
|
+
end
|
45
|
+
|
46
|
+
directory
|
47
|
+
end
|
48
|
+
|
49
|
+
# @param [String] directory
|
50
|
+
# Location of the dump directory.
|
51
|
+
# @return [Data] `self`
|
52
|
+
def load( directory )
|
53
|
+
each do |name, state|
|
54
|
+
send( "#{name}=", state.class.load( "#{directory}/#{name}/" ) )
|
55
|
+
end
|
56
|
+
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
# Clears all data.
|
61
|
+
def clear
|
62
|
+
each { |_, state| state.clear }
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def each( &block )
|
69
|
+
accessors.each do |attr|
|
70
|
+
block.call attr, send( attr )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def accessors
|
75
|
+
instance_variables.map do |ivar|
|
76
|
+
attribute = "#{ivar.to_s.gsub('@','')}"
|
77
|
+
next if !methods.include?( :"#{attribute}=" )
|
78
|
+
attribute.to_sym
|
79
|
+
end.compact
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
reset
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Cuboid
|
2
|
+
class Data
|
3
|
+
|
4
|
+
# Data for {Cuboid::Application}.
|
5
|
+
#
|
6
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
7
|
+
class Application
|
8
|
+
|
9
|
+
# {Application} error namespace.
|
10
|
+
#
|
11
|
+
# All {Application} errors inherit from and live under it.
|
12
|
+
#
|
13
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
14
|
+
class Error < Data::Error
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :runtime
|
18
|
+
attr_accessor :report
|
19
|
+
|
20
|
+
def statistics
|
21
|
+
{
|
22
|
+
runtime: !!@runtime,
|
23
|
+
report: !!@report
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def dump( directory )
|
28
|
+
FileUtils.mkdir_p( directory )
|
29
|
+
|
30
|
+
d = Cuboid::Application.serializer.dump( @report )
|
31
|
+
IO.binwrite( "#{directory}/report", d )
|
32
|
+
|
33
|
+
d = Cuboid::Application.serializer.dump( @runtime )
|
34
|
+
IO.binwrite( "#{directory}/runtime", d )
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.load( directory )
|
38
|
+
application = new
|
39
|
+
application.report = Cuboid::Application.serializer.load( IO.binread( "#{directory}/report" ) )
|
40
|
+
application.runtime = Cuboid::Application.serializer.load( IO.binread( "#{directory}/runtime" ) )
|
41
|
+
application
|
42
|
+
end
|
43
|
+
|
44
|
+
def clear
|
45
|
+
@runtime = nil
|
46
|
+
@report = nil
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/cuboid/error.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
module Cuboid
|
2
|
+
|
3
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
4
|
+
class OptionGroup
|
5
|
+
|
6
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
7
|
+
class Error < Options::Error
|
8
|
+
end
|
9
|
+
|
10
|
+
class <<self
|
11
|
+
|
12
|
+
# @return [Hash]
|
13
|
+
# Specified default values for attribute readers.
|
14
|
+
def defaults
|
15
|
+
@defaults ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sets default values for attribute readers, when an attribute reader
|
19
|
+
# returns `nil` the default values will be returned instead.
|
20
|
+
#
|
21
|
+
# @param [Hash] default_values
|
22
|
+
# Default values for attributes.
|
23
|
+
def set_defaults( default_values )
|
24
|
+
defaults.merge! default_values
|
25
|
+
|
26
|
+
# Set the specified default values as overrides to the attribute
|
27
|
+
# readers.
|
28
|
+
defaults.each do |ivar, value|
|
29
|
+
define_method "#{ivar}=" do |v|
|
30
|
+
instance_variable_set( "@#{ivar}".to_sym, v.nil? ? value : v)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
defaults
|
35
|
+
end
|
36
|
+
|
37
|
+
def inherited( child )
|
38
|
+
Options.register_group child
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
defaults.each do |k, v|
|
44
|
+
send "#{k}=", v
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_rpc_data
|
49
|
+
to_h.my_stringify_keys(false)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [Hash]
|
53
|
+
# Values for all attribute accessors which aren't the defaults.
|
54
|
+
def to_h
|
55
|
+
h = {}
|
56
|
+
instance_variables.each do |ivar|
|
57
|
+
method = normalize_ivar( ivar )
|
58
|
+
sym = method.to_sym
|
59
|
+
value = instance_variable_get( ivar )
|
60
|
+
|
61
|
+
next if !respond_to?( "#{method}=" )
|
62
|
+
|
63
|
+
h[sym] = value
|
64
|
+
end
|
65
|
+
h
|
66
|
+
end
|
67
|
+
def to_hash
|
68
|
+
to_h
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [Hash]
|
72
|
+
# Hash of errors with the name of the invalid options as the keys.
|
73
|
+
#
|
74
|
+
# @abstract
|
75
|
+
def validate
|
76
|
+
{}
|
77
|
+
end
|
78
|
+
|
79
|
+
def ==( other )
|
80
|
+
hash == other.hash
|
81
|
+
end
|
82
|
+
|
83
|
+
def hash
|
84
|
+
to_h.hash
|
85
|
+
end
|
86
|
+
|
87
|
+
# @param [Hash] options
|
88
|
+
# Data to use to update the group's attributes.
|
89
|
+
#
|
90
|
+
# @return [OptionGroup]
|
91
|
+
# `self`
|
92
|
+
def update( options )
|
93
|
+
options.to_hash.each { |k, v| send( "#{k}=", v ) }
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
# @param [OptionGroup] other
|
98
|
+
#
|
99
|
+
# @return [OptionGroup]
|
100
|
+
# `self`
|
101
|
+
def merge( other )
|
102
|
+
update( other.to_h )
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return (see .defaults)
|
106
|
+
def defaults
|
107
|
+
self.class.defaults
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.attr_accessor( *vars )
|
111
|
+
attributes.concat( vars )
|
112
|
+
super( *vars )
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.attributes
|
116
|
+
@attributes ||= []
|
117
|
+
end
|
118
|
+
|
119
|
+
def attributes
|
120
|
+
self.class.attributes
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def normalize_ivar( ivar )
|
126
|
+
ivar.to_s.gsub( '@', '' )
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module Cuboid::OptionGroups
|
4
|
+
|
5
|
+
# Generic OpenStruct-based class for general purpose data storage.
|
6
|
+
#
|
7
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
8
|
+
class Datastore < Cuboid::OptionGroup
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@source = OpenStruct.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing( method, *args, &block )
|
15
|
+
@source.send( method, *args, &block )
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_h
|
19
|
+
@source.marshal_dump
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Cuboid::OptionGroups
|
2
|
+
|
3
|
+
# Holds options for {RPC::Server::Dispatcher} servers.
|
4
|
+
#
|
5
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
6
|
+
class Dispatcher < Cuboid::OptionGroup
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
# URL of a {RPC::Server::Dispatcher}.
|
10
|
+
attr_accessor :url
|
11
|
+
|
12
|
+
# @return [Array<Integer>]
|
13
|
+
# Range of ports to use when spawning instances, first entry should be
|
14
|
+
# the lowest port number, last the max port number.
|
15
|
+
attr_accessor :instance_port_range
|
16
|
+
|
17
|
+
# @return [String]
|
18
|
+
# The URL of a neighbouring {RPC::Server::Dispatcher}, applicable when
|
19
|
+
# {RPC::Server::Dispatcher} are connected to each other to form a Grid.
|
20
|
+
#
|
21
|
+
# @see RPC::Server::Dispatcher::Node
|
22
|
+
attr_accessor :neighbour
|
23
|
+
|
24
|
+
# @return [Float]
|
25
|
+
# How regularly to check for neighbour statuses.
|
26
|
+
attr_accessor :ping_interval
|
27
|
+
|
28
|
+
# @return [String]
|
29
|
+
# Dispatcher name.
|
30
|
+
attr_accessor :name
|
31
|
+
|
32
|
+
set_defaults(
|
33
|
+
ping_interval: 5.0,
|
34
|
+
instance_port_range: [1025, 65535]
|
35
|
+
)
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Cuboid::OptionGroups
|
2
|
+
|
3
|
+
# {Cuboid::UI::Output} options.
|
4
|
+
#
|
5
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
6
|
+
class Output < Cuboid::OptionGroup
|
7
|
+
|
8
|
+
# @return [Bool]
|
9
|
+
# `true` if the output of the RPC instances should be redirected to a
|
10
|
+
# file, `false` otherwise.
|
11
|
+
attr_accessor :reroute_to_logfile
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Cuboid::OptionGroups
|
5
|
+
|
6
|
+
# Holds paths to the directories of various system components.
|
7
|
+
#
|
8
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
9
|
+
class Paths < Cuboid::OptionGroup
|
10
|
+
|
11
|
+
TMPDIR_SUFFIX = 'Cuboid_'
|
12
|
+
|
13
|
+
[
|
14
|
+
:root,
|
15
|
+
:logs,
|
16
|
+
:reports,
|
17
|
+
:executables,
|
18
|
+
:services,
|
19
|
+
:lib,
|
20
|
+
:support,
|
21
|
+
:mixins,
|
22
|
+
:snapshots
|
23
|
+
].each do |type|
|
24
|
+
attr_accessor type
|
25
|
+
|
26
|
+
define_method "#{type}=" do |path|
|
27
|
+
if !path
|
28
|
+
return instance_variable_set :"@#{type}", defaults[type]
|
29
|
+
end
|
30
|
+
|
31
|
+
path += '/' if !path.end_with? '/'
|
32
|
+
|
33
|
+
if !File.directory? path
|
34
|
+
raise ArgumentError,
|
35
|
+
"#{type.to_s.capitalize} directory does not exist: #{path}"
|
36
|
+
end
|
37
|
+
|
38
|
+
instance_variable_set :"@#{type}", path
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String]
|
43
|
+
attr_accessor :application
|
44
|
+
|
45
|
+
# @!attribute root
|
46
|
+
# @return [String]
|
47
|
+
|
48
|
+
# @!attribute lib
|
49
|
+
# @return [String]
|
50
|
+
|
51
|
+
# @!attribute support
|
52
|
+
# @return [String]
|
53
|
+
|
54
|
+
# @!attribute mixins
|
55
|
+
# @return [String]
|
56
|
+
|
57
|
+
# @!attribute components
|
58
|
+
# @return [String]
|
59
|
+
|
60
|
+
# @!attribute services
|
61
|
+
# @return [String]
|
62
|
+
|
63
|
+
# @!attribute reports
|
64
|
+
# @return [String]
|
65
|
+
# Report storage.
|
66
|
+
|
67
|
+
# @!attribute snapshots
|
68
|
+
# @return [String]
|
69
|
+
# Snapshot storage.
|
70
|
+
|
71
|
+
# @!attribute executables
|
72
|
+
# @return [String]
|
73
|
+
# System processes (instance, dispatcher, browser, etc.).
|
74
|
+
|
75
|
+
def initialize
|
76
|
+
@root = self.root_path
|
77
|
+
|
78
|
+
@snapshots = self.config['snapshots'] || @root + 'snapshots/'
|
79
|
+
@reports = self.config['reports'] || @root + 'reports/'
|
80
|
+
|
81
|
+
if ENV['CUBOID_LOGDIR'].to_s != ''
|
82
|
+
@logs = "#{ENV['CUBOID_LOGDIR']}/"
|
83
|
+
elsif self.config['logs']
|
84
|
+
@logs = self.config['logs']
|
85
|
+
else
|
86
|
+
@logs = "#{@root}logs/"
|
87
|
+
end
|
88
|
+
|
89
|
+
@lib = @root + 'lib/cuboid/'
|
90
|
+
@executables = @lib + 'processes/executables/'
|
91
|
+
@support = @lib + 'support/'
|
92
|
+
@mixins = @support + 'mixins/'
|
93
|
+
|
94
|
+
instance_variables.each do |iv|
|
95
|
+
defaults[iv.to_s.sub( '@', '' ).to_sym] = instance_variable_get( iv )
|
96
|
+
end
|
97
|
+
|
98
|
+
tmpdir
|
99
|
+
end
|
100
|
+
|
101
|
+
def root_path
|
102
|
+
self.class.root_path
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [String]
|
106
|
+
# Root path of the engine.
|
107
|
+
def self.root_path
|
108
|
+
File.expand_path( File.dirname( __FILE__ ) + '/../../..' ) + '/'
|
109
|
+
end
|
110
|
+
|
111
|
+
def os_tmpdir
|
112
|
+
return @os_tmpdir if @os_tmpdir
|
113
|
+
|
114
|
+
if config['tmpdir'].to_s.empty?
|
115
|
+
# On MS Windows Dir.tmpdir can return the path with a shortname,
|
116
|
+
# better avoid that as it can be insonsistent with other paths.
|
117
|
+
@os_tmpdir = Cuboid.get_long_win32_filename( Dir.tmpdir )
|
118
|
+
else
|
119
|
+
@os_tmpdir = Cuboid.get_long_win32_filename( config['tmpdir'] )
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def tmpdir
|
124
|
+
return @tmpdir if @tmpdir
|
125
|
+
|
126
|
+
dir = tmp_dir_for( Process.pid )
|
127
|
+
|
128
|
+
FileUtils.mkdir_p dir
|
129
|
+
at_exit do
|
130
|
+
FileUtils.rm_rf dir
|
131
|
+
end
|
132
|
+
|
133
|
+
@tmpdir = dir
|
134
|
+
end
|
135
|
+
|
136
|
+
def tmp_dir_for( pid )
|
137
|
+
"#{os_tmpdir}/#{TMPDIR_SUFFIX}#{pid}"
|
138
|
+
end
|
139
|
+
|
140
|
+
def config
|
141
|
+
self.class.config
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.paths_config_file
|
145
|
+
Cuboid.get_long_win32_filename "#{root_path}config/paths.yml"
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.clear_config_cache
|
149
|
+
@config = nil
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.config
|
153
|
+
return @config if @config
|
154
|
+
|
155
|
+
if !File.exist?( paths_config_file )
|
156
|
+
@config = {}
|
157
|
+
else
|
158
|
+
@config = YAML.load( IO.read( paths_config_file ) )
|
159
|
+
end
|
160
|
+
|
161
|
+
@config.dup.each do |category, dir|
|
162
|
+
if dir.to_s.empty?
|
163
|
+
@config.delete( category )
|
164
|
+
next
|
165
|
+
end
|
166
|
+
|
167
|
+
dir = Cuboid.get_long_win32_filename( dir )
|
168
|
+
|
169
|
+
if !Cuboid.windows?
|
170
|
+
dir.gsub!( '~', ENV['HOME'] )
|
171
|
+
end
|
172
|
+
|
173
|
+
dir << '/' if !dir.end_with?( '/' )
|
174
|
+
|
175
|
+
@config[category] = dir
|
176
|
+
|
177
|
+
FileUtils.mkdir_p dir
|
178
|
+
end
|
179
|
+
|
180
|
+
@config
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
end
|