frosty 0.0.1.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/frosty.rb +61 -0
- data/lib/frosty/etcd.rb +29 -0
- data/lib/frosty/node.rb +50 -0
- data/lib/frosty/service.rb +105 -0
- data/lib/frosty/service/endpoint.rb +11 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
N2Y3YjU1MjM3YWM2MmM3ZDdiZGE0NjUzMzg4MzEyOWVhNzRlNTcyZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MzgxNWM0YjM5MjEzNjkyMjEwNWUxYzQ5N2U1YTMwNzcxYTZiNDY1Mg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OWEyNzhlNzJmNDZlYzM0OWEwNzQwMGYwYmIwMWQ2N2U3Y2FmZTZhZWYxZTQ4
|
10
|
+
ZjMwMzRiODFkMDBmMDQ3ODY5NTZlODFmMmExM2VhZDNiZDFjM2QwNWJkYzZl
|
11
|
+
NDA4NWY5YTYwZmQ3MmMyMDkwMzZmNWE0NDRlN2FjNmYyMGY3NTY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDgwYTkzMmI3NmI1NzhmY2M5YTJjN2I0NWVlYWU0NjI3MjhhZTQwMTY3Mzkz
|
14
|
+
YzViYmZhOWE3ZTBiMjUxYTk1ZWYxMzI5ODQ1MzFiNzZjNmMyYjg5NjhjNDVk
|
15
|
+
YWNkMzQwNzMxZTNmNTM5YzZhNjU4MTJjMzRkZGIzYmViNjIwYmY=
|
data/lib/frosty.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'frosty/service'
|
2
|
+
require 'frosty/node'
|
3
|
+
require 'frosty/etcd'
|
4
|
+
require 'etcd'
|
5
|
+
|
6
|
+
class Frosty
|
7
|
+
include Frosty::Etcd
|
8
|
+
|
9
|
+
attr_accessor :environment, :server, :port
|
10
|
+
def initialize(server = '127.0.0.1', port = '4001', options ={})
|
11
|
+
@server = server
|
12
|
+
@port = port
|
13
|
+
@environment = options['environment'] || 'default'
|
14
|
+
end
|
15
|
+
|
16
|
+
def can_connect?
|
17
|
+
connect
|
18
|
+
ret = true
|
19
|
+
begin
|
20
|
+
@connection.get('/')
|
21
|
+
rescue
|
22
|
+
ret = false
|
23
|
+
end
|
24
|
+
ret
|
25
|
+
end
|
26
|
+
|
27
|
+
def connect
|
28
|
+
@connection = ::Etcd.client(:host => @server,
|
29
|
+
:port => @port)
|
30
|
+
end
|
31
|
+
|
32
|
+
def services
|
33
|
+
array_of_keys("/#{@environment}/services/")
|
34
|
+
end
|
35
|
+
|
36
|
+
def nodes
|
37
|
+
array_of_keys("/#{@environment}/nodes/")
|
38
|
+
end
|
39
|
+
|
40
|
+
# This probably needs to be re-worked
|
41
|
+
def array_of_keys(key)
|
42
|
+
n = query(@connection, key)
|
43
|
+
if n.nil?
|
44
|
+
[]
|
45
|
+
else
|
46
|
+
a = []
|
47
|
+
n.each do |value|
|
48
|
+
a.push(value.key.gsub(key, ''))
|
49
|
+
end
|
50
|
+
a
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def service(name)
|
55
|
+
Frosty::Service.new(name, @environment, @connection)
|
56
|
+
end
|
57
|
+
|
58
|
+
def node(name)
|
59
|
+
Frosty::Node.new(name, @environment, @connection)
|
60
|
+
end
|
61
|
+
end
|
data/lib/frosty/etcd.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class Frosty
|
2
|
+
module Etcd
|
3
|
+
def query(connection, key)
|
4
|
+
begin
|
5
|
+
connection.get(key)
|
6
|
+
rescue
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def write(connection, key, value)
|
12
|
+
begin
|
13
|
+
connection.set(key, value)
|
14
|
+
rescue
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def hashify(responses)
|
20
|
+
h = {}
|
21
|
+
responses.each do |response|
|
22
|
+
unless response.value.nil?
|
23
|
+
h[response.key.split('/').pop] = response.value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
h
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/frosty/node.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'frosty/etcd'
|
2
|
+
|
3
|
+
class Frosty
|
4
|
+
class Node
|
5
|
+
include Frosty::Etcd
|
6
|
+
|
7
|
+
def initialize(ip, environment, connection)
|
8
|
+
@ip = ip
|
9
|
+
@connection = connection
|
10
|
+
@base_path = "/#{environment}/nodes/#{ip}/"
|
11
|
+
refresh
|
12
|
+
end
|
13
|
+
|
14
|
+
def exists?
|
15
|
+
if query(@connection, @base_path).nil?
|
16
|
+
false
|
17
|
+
else
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def fetch_services
|
23
|
+
ret = []
|
24
|
+
if exists?
|
25
|
+
services = query(@connection, @base_path + 'services')
|
26
|
+
unless services.nil?
|
27
|
+
ret = services.value.split(',')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
ret
|
31
|
+
end
|
32
|
+
|
33
|
+
def refresh
|
34
|
+
@services = fetch_services
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_service(name)
|
38
|
+
@services.push name
|
39
|
+
end
|
40
|
+
|
41
|
+
def services
|
42
|
+
@services
|
43
|
+
end
|
44
|
+
|
45
|
+
def save
|
46
|
+
services = @services.join(',')
|
47
|
+
write(@connection, @base_path + 'services', services)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require_relative 'service/endpoint'
|
2
|
+
require 'frosty/etcd'
|
3
|
+
|
4
|
+
class Frosty
|
5
|
+
class Service
|
6
|
+
include Frosty::Etcd
|
7
|
+
|
8
|
+
attr_accessor :role, :status
|
9
|
+
def initialize(name, environment, connection)
|
10
|
+
@name = name
|
11
|
+
@connection = connection
|
12
|
+
@base_path = "/#{environment}/services/#{name}/"
|
13
|
+
@endpoints = fetch_endpoints
|
14
|
+
end
|
15
|
+
|
16
|
+
def exists?
|
17
|
+
if query(@connection, @base_path).nil?
|
18
|
+
false
|
19
|
+
else
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def has_master?
|
25
|
+
ret = false
|
26
|
+
if self.exists?
|
27
|
+
@endpoints.each do |ep|
|
28
|
+
if ep.role == 'master'
|
29
|
+
ret = true
|
30
|
+
break
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
ret
|
35
|
+
end
|
36
|
+
|
37
|
+
# return ip of master
|
38
|
+
def masters
|
39
|
+
m = []
|
40
|
+
if self.has_master?
|
41
|
+
@endpoints.each do |ep|
|
42
|
+
if ep.role == 'master'
|
43
|
+
m.push ep.ip
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
m
|
48
|
+
end
|
49
|
+
|
50
|
+
def refresh
|
51
|
+
@endpoints = fetch_endpoints
|
52
|
+
end
|
53
|
+
|
54
|
+
def fetch_endpoints
|
55
|
+
ret = []
|
56
|
+
endpoints = query(@connection, @base_path + 'endpoints')
|
57
|
+
unless endpoints.nil?
|
58
|
+
endpoints.each do |e|
|
59
|
+
ret.push endpoint(e.key.split('/').pop)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
ret
|
63
|
+
end
|
64
|
+
|
65
|
+
def endpoints
|
66
|
+
ret = []
|
67
|
+
@endpoints.each do |endpoint|
|
68
|
+
ret.push endpoint.ip
|
69
|
+
end
|
70
|
+
ret
|
71
|
+
end
|
72
|
+
|
73
|
+
def endpoint(ip)
|
74
|
+
resp = query(@connection, @base_path + "endpoints/#{ip}")
|
75
|
+
|
76
|
+
ep = Frosty::Service::Endpoint.new(ip)
|
77
|
+
if resp.nil?
|
78
|
+
if has_master?
|
79
|
+
ep.role = 'slave'
|
80
|
+
else
|
81
|
+
ep.role = 'master'
|
82
|
+
end
|
83
|
+
else
|
84
|
+
info = hashify(resp)
|
85
|
+
ep.port = info['port']
|
86
|
+
ep.role = info['role']
|
87
|
+
ep.status = info['status']
|
88
|
+
end
|
89
|
+
ep
|
90
|
+
end
|
91
|
+
|
92
|
+
def save_endpoint(ep)
|
93
|
+
if ep.port.nil?
|
94
|
+
raise TypeError, "Endpoint port must be either a string or an integer"
|
95
|
+
end
|
96
|
+
path = @base_path + "endpoints/#{ep.ip}/"
|
97
|
+
write(@connection, path + "port", ep.port)
|
98
|
+
write(@connection, path + "role", ep.role)
|
99
|
+
unless ep.status.nil?
|
100
|
+
write(@connection, path + "status", ep.status)
|
101
|
+
end
|
102
|
+
refresh
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: frosty
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.alpha1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jim Rosser
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: etcd
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Provides Libraries to query and save to etcd based on the enigma project
|
28
|
+
email: jarosser06@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/frosty.rb
|
34
|
+
- lib/frosty/node.rb
|
35
|
+
- lib/frosty/service.rb
|
36
|
+
- lib/frosty/etcd.rb
|
37
|
+
- lib/frosty/service/endpoint.rb
|
38
|
+
homepage: https://github.com/enigmaproject/frosty
|
39
|
+
licenses:
|
40
|
+
- mit
|
41
|
+
metadata: {}
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ! '>'
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.3.1
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 2.0.6
|
59
|
+
signing_key:
|
60
|
+
specification_version: 4
|
61
|
+
summary: Etcd with Chef
|
62
|
+
test_files: []
|