boned 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/README.md +6 -4
- data/Rakefile +45 -38
- data/VERSION.yml +4 -0
- data/api/api-set.rb +31 -30
- data/api/api.rb +49 -49
- data/app.ru +36 -0
- data/bin/boned +6 -71
- data/boned.gemspec +68 -46
- data/config/redis-server.conf +149 -131
- data/lib/boned/api/base.rb +163 -0
- data/lib/boned/api.rb +76 -69
- data/lib/boned/app.rb +0 -0
- data/lib/boned.rb +33 -165
- data/try/10_basics_try.rb +37 -0
- data/try/11_signature_try.rb +11 -0
- data/try/20_keys_try.rb +34 -0
- metadata +72 -30
- data/config.ru +0 -31
- data/lib/boned/api/debug.rb +0 -21
- data/lib/boned/api/redis.rb +0 -44
- data/lib/boned/api/service.rb +0 -86
- data/lib/boned/cli.rb +0 -62
- data/lib/boned/models/bone.rb +0 -112
- data/lib/boned/models.rb +0 -34
- data/lib/boned/server.rb +0 -67
- data/try/10_bone_model.rb +0 -21
data/lib/boned/cli.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'boned/server'
|
2
|
-
require 'pp'
|
3
|
-
|
4
|
-
class Boned::CLI < Drydock::Command
|
5
|
-
attr_accessor :exit_code
|
6
|
-
|
7
|
-
|
8
|
-
def start
|
9
|
-
Boned.connect
|
10
|
-
if Boned.service_available?('127.0.0.1', server_opts[:port])
|
11
|
-
raise Boned::Server::ServerRunning, server_opts[:port]
|
12
|
-
end
|
13
|
-
Boned::Controllers::Controller.new(server_opts).start
|
14
|
-
end
|
15
|
-
|
16
|
-
def stop
|
17
|
-
Boned.connect(false)
|
18
|
-
Boned.stop_redis
|
19
|
-
if not Boned.service_available?('127.0.0.1', server_opts[:port])
|
20
|
-
raise Boned::Server::ServerNotRunning, server_opts[:port]
|
21
|
-
end
|
22
|
-
Boned::Controllers::Controller.new(server_opts).stop
|
23
|
-
end
|
24
|
-
|
25
|
-
def stop_redis
|
26
|
-
Boned.connect(false)
|
27
|
-
Boned.stop_redis
|
28
|
-
end
|
29
|
-
|
30
|
-
def info
|
31
|
-
require 'yaml'
|
32
|
-
if Boned.service_available?('127.0.0.1', server_opts[:port])
|
33
|
-
puts "boned is running on port #{server_opts[:port]}"
|
34
|
-
else
|
35
|
-
puts "No boned"
|
36
|
-
end
|
37
|
-
puts "Options:", server_opts.to_yaml if @global.verbose > 0
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def server_opts
|
43
|
-
port = @global.port || Boned::Server::DEFAULT_PORT
|
44
|
-
config = @global.rackup || File.join(BONED_HOME, "config.ru")
|
45
|
-
@server_opts ||= {
|
46
|
-
:chdir => Dir.pwd,
|
47
|
-
:environment => @global.environment || 'development',
|
48
|
-
:address => '0.0.0.0',
|
49
|
-
:port => port,
|
50
|
-
:timeout => 30,
|
51
|
-
:log => "/tmp/boned-#{port}.log",
|
52
|
-
:pid => "/tmp/boned-#{port}.pid",
|
53
|
-
:max_conns => Thin::Server::DEFAULT_MAXIMUM_CONNECTIONS,
|
54
|
-
:max_persistent_conns => Thin::Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS,
|
55
|
-
:require => [],
|
56
|
-
:wait => Thin::Controllers::Cluster::DEFAULT_WAIT_TIME,
|
57
|
-
:backend => "Boned::Server",
|
58
|
-
:rackup => config,
|
59
|
-
:daemonize => @global.daemon || false
|
60
|
-
}
|
61
|
-
end
|
62
|
-
end
|
data/lib/boned/models/bone.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
|
2
|
-
# Bone:a462b9ebda71f16cb1567ba8704695ae8dba9999:simple
|
3
|
-
# Bone:a462b9ebda71f16cb1567ba8704695ae8dba9999:us-east-1a-dev-fe:simple
|
4
|
-
# Bone:a462b9ebda71f16cb1567ba8704695ae8dba9999:dev-fe:simple
|
5
|
-
# Bone:a462b9ebda71f16cb1567ba8704695ae8dba9999:us-east-1a:simple
|
6
|
-
|
7
|
-
class Bone < Boned::Model
|
8
|
-
|
9
|
-
primarykey :boneid
|
10
|
-
|
11
|
-
field :token
|
12
|
-
field :name
|
13
|
-
field :value
|
14
|
-
field :prop
|
15
|
-
|
16
|
-
def initialize(token, name, value, prop={})
|
17
|
-
@prop ||= {}
|
18
|
-
prop ||= {}
|
19
|
-
prop.each_pair { |n,v| @prop[n.to_sym] ||= v }
|
20
|
-
@token, @name = token, name
|
21
|
-
@new = refresh!.nil?
|
22
|
-
@value = value unless value.nil? # use the new value if provided
|
23
|
-
@prop[:created] = Time.now.utc.to_i if new? || @prop[:created].nil?
|
24
|
-
# resolve string/symbol ambiguity for properties
|
25
|
-
def @prop.[](k) super(k.to_s.to_sym) || super(k.to_s) end
|
26
|
-
def @prop.[]=(k,v) super(k.to_s.to_sym,v) end
|
27
|
-
end
|
28
|
-
|
29
|
-
def [](k)
|
30
|
-
self.respond_to?(k) ? self.send : self.prop[k]
|
31
|
-
end
|
32
|
-
|
33
|
-
def new?() @new == true end
|
34
|
-
|
35
|
-
def file?
|
36
|
-
!prop[:file].nil?
|
37
|
-
end
|
38
|
-
|
39
|
-
def region() prop[:region] end
|
40
|
-
def env() prop[:env] end
|
41
|
-
def role() prop[:role] end
|
42
|
-
def num() prop[:num] end
|
43
|
-
def path() prop[:path] end
|
44
|
-
|
45
|
-
def boneid
|
46
|
-
loc = [region, env, role, num].compact.join('-')
|
47
|
-
parts = loc.empty? ? [token] : [token, loc]
|
48
|
-
parts << path.gsub(/\A\//, '').tr('/', '-') unless path.nil? # TODO: support windows
|
49
|
-
parts << name
|
50
|
-
parts.collect { |p| p.to_s.tr(':', '-') }.join(':')
|
51
|
-
end
|
52
|
-
|
53
|
-
def key(*parts)
|
54
|
-
parts.unshift boneid
|
55
|
-
self.class.key *parts
|
56
|
-
end
|
57
|
-
|
58
|
-
def save
|
59
|
-
redis.set(key, value)
|
60
|
-
prop[:modified] = Time.now.utc.to_i
|
61
|
-
redis.set(key(:prop), prop.to_json)
|
62
|
-
end
|
63
|
-
|
64
|
-
def refresh!
|
65
|
-
Boned.ld "REFRESH: #{key}"
|
66
|
-
@value = redis.get key
|
67
|
-
prop = redis.get key(:prop)
|
68
|
-
prop &&= JSON.parse(prop) rescue {}
|
69
|
-
# Merge the stored props with the current ones. Enforce symbols!
|
70
|
-
prop.each_pair { |n,v| @prop[n.to_sym] ||= v }
|
71
|
-
Boned.ld " -> #{@value} #{@prop.inspect}"
|
72
|
-
self
|
73
|
-
rescue
|
74
|
-
nil
|
75
|
-
end
|
76
|
-
|
77
|
-
def destroy!
|
78
|
-
Boned.ld "DESTROY: #{key}"
|
79
|
-
redis.del key
|
80
|
-
redis.del key(:prop)
|
81
|
-
end
|
82
|
-
|
83
|
-
class << self
|
84
|
-
|
85
|
-
def del(token, name, opts={})
|
86
|
-
bone = get(token, name, opts)
|
87
|
-
bone.destroy!
|
88
|
-
bone
|
89
|
-
end
|
90
|
-
|
91
|
-
def get(token, name, opts={})
|
92
|
-
bone = Bone.new token, name, nil, opts
|
93
|
-
raise Boned::BadBone, bone.name if bone.value.nil?
|
94
|
-
bone
|
95
|
-
end
|
96
|
-
|
97
|
-
def keys(token, k=nil, opts={})
|
98
|
-
search = key(token) << '*'
|
99
|
-
search << k unless k.nil?
|
100
|
-
Boned.ld "SEARCHING: #{search}"
|
101
|
-
dirty = redis.keys search # contains :prop when no keyname specified
|
102
|
-
clean = []
|
103
|
-
dirty.each { |k|
|
104
|
-
next if k.match(/prop\z/);
|
105
|
-
clean << k.split(':')[4..-1].join(':')
|
106
|
-
}
|
107
|
-
clean
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
data/lib/boned/models.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Boned
|
4
|
-
class Model < Storable
|
5
|
-
def self.key(*el)
|
6
|
-
raise "#{self}: nil keypart: #{el.inspect}" if el.size != el.compact.size
|
7
|
-
a = "v1::#{self}"
|
8
|
-
a << ':' << el.join(':') unless el.empty?
|
9
|
-
a
|
10
|
-
end
|
11
|
-
def self.redis
|
12
|
-
Boned.redis
|
13
|
-
end
|
14
|
-
def self.primarykey(v=nil)
|
15
|
-
unless v.nil?
|
16
|
-
@primarykey = v
|
17
|
-
class_eval do
|
18
|
-
def primarykey() send(self.class.primarykey) end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
@primarykey
|
22
|
-
end
|
23
|
-
def redis
|
24
|
-
self.class.redis
|
25
|
-
end
|
26
|
-
def save
|
27
|
-
redis.sadd(self.class.key(kind, :all), self.primarykey) &&
|
28
|
-
redis.set(key(:created), self.time.to_i) &&
|
29
|
-
redis.set(key(:object), to_json)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
Boned.require_glob 'boned', 'models', '*.rb'
|
data/lib/boned/server.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'thin'
|
2
|
-
require 'logging'
|
3
|
-
require 'forwardable'
|
4
|
-
|
5
|
-
module Boned
|
6
|
-
class Server < Thin::Backends::Base
|
7
|
-
DEFAULT_PORT = 6043.freeze
|
8
|
-
|
9
|
-
class ServerRunning < Boned::Problem
|
10
|
-
def message() "Server already running on port: #{super}" end
|
11
|
-
end
|
12
|
-
|
13
|
-
class ServerNotRunning < Boned::Problem
|
14
|
-
def message() "Server not running on port: #{super}" end
|
15
|
-
end
|
16
|
-
|
17
|
-
class << self
|
18
|
-
end
|
19
|
-
|
20
|
-
# Address and port on which the server is listening for connections.
|
21
|
-
attr_accessor :host, :port
|
22
|
-
|
23
|
-
def initialize(host, port, options)
|
24
|
-
@host = host
|
25
|
-
@port = port
|
26
|
-
super()
|
27
|
-
end
|
28
|
-
|
29
|
-
# Connect the server
|
30
|
-
def connect
|
31
|
-
@signature = EventMachine.start_server(@host, @port, Thin::Connection, &method(:initialize_connection))
|
32
|
-
rescue => ex
|
33
|
-
puts ex.message
|
34
|
-
puts ex.backtrace if Boned.debug
|
35
|
-
stop!
|
36
|
-
end
|
37
|
-
|
38
|
-
# Stops the server
|
39
|
-
def disconnect
|
40
|
-
EventMachine.stop_server(@signature)
|
41
|
-
end
|
42
|
-
|
43
|
-
def to_s
|
44
|
-
"#{@host}:#{@port}"
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
module Controllers
|
49
|
-
class Controller < Thin::Controllers::Controller
|
50
|
-
end
|
51
|
-
class Service < Thin::Controllers::Service
|
52
|
-
end
|
53
|
-
class Cluster < Thin::Controllers::Cluster
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
#controller = case
|
62
|
-
#when cluster? then Thin::Controllers::Cluster.new(options)
|
63
|
-
#when service? then Thin::Controllers::Service.new(options)
|
64
|
-
#else Thin::Controllers::Controller.new(options)
|
65
|
-
#end
|
66
|
-
|
67
|
-
|
data/try/10_bone_model.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# ruby -rubygems -Ilib try/10_bone_model.rb
|
2
|
-
require 'boned'
|
3
|
-
Boned.load_config
|
4
|
-
Boned.connect
|
5
|
-
Boned.enable_debug
|
6
|
-
|
7
|
-
token = Digest::SHA256.hexdigest('1901484c41b8752d61863e323c743')
|
8
|
-
key = 'simple'
|
9
|
-
|
10
|
-
puts Bone.keys(token)
|
11
|
-
|
12
|
-
__END__
|
13
|
-
opts = { :env => 'dev', :region => 'us-east-1a', :num => '01', :role => 'fe', :path => Dir.pwd }
|
14
|
-
bone = Bone.new token, key, rand(100000).to_i, opts
|
15
|
-
#puts "BONE: " << bone.inspect, $/
|
16
|
-
bone.save
|
17
|
-
#puts "KEYS: " << Bone.keys( token, key).inspect, $/
|
18
|
-
|
19
|
-
bone = Bone.get( token, key, opts)
|
20
|
-
puts "GET: " << bone.inspect, $/
|
21
|
-
puts bone.to_json
|