etcd 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/etcd.rb +3 -1
- data/lib/etcd/client.rb +39 -11
- data/lib/etcd/node.rb +1 -1
- data/lib/etcd/version.rb +1 -1
- data/spec/data/ca.crt +23 -0
- data/spec/data/client.crt +85 -0
- data/spec/data/client.key +28 -0
- data/spec/data/server.crt +83 -0
- data/spec/data/server.key +28 -0
- data/spec/etcd/basic_auth_client_spec.rb +11 -1
- data/spec/etcd/client_spec.rb +11 -4
- data/spec/etcd/keys_spec.rb +88 -50
- data/spec/etcd/leader_spec.rb +9 -1
- data/spec/etcd/lock_spec.rb +9 -1
- data/spec/etcd/node_spec.rb +9 -1
- data/spec/etcd/read_only_client_spec.rb +8 -1
- data/spec/etcd/readme_spec.rb +27 -18
- data/spec/etcd/stats_spec.rb +9 -1
- data/spec/etcd/test_and_set_spec.rb +9 -1
- data/spec/etcd/watch_spec.rb +10 -1
- data/spec/spec_helper.rb +79 -40
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGE5YmE0ZDk3MDJmNjQzZDJkMWJhOTg2ZDNiODM4NGEyYzFlNDg0Yw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTM0MzMyY2RlZWFlYjAxYTc2OGU3Mjk5YmEwOTlmYmJkN2NiZTJlNg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MGM0YzhmZDdmYmJmY2IyZmViYTEwMDlkNmNkMDQ2ZDhlNjE0Nzg4MDA0MjUw
|
10
|
+
MDcwY2QyNzA1MDEwN2IwZmMwMThlN2MxNTNmOGRiNDIyNTU5ZjcyY2I2NWQ5
|
11
|
+
ODI5MWU2ZDVjZjQxMDFhNTkyY2QzMWExMDYwNjBmNDk1OTJhYmE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmM3ZWU4NDUzOWQwY2U2MzM0ZWI2YTM2MDMxOTJhOGE2OTJmNzUyNGM3Mzgw
|
14
|
+
OWViNGFmNDc3MjA5MWFkODQxYWI5YTQyMzlhMmFmM2RhYTIwOGI5NTI5NzI4
|
15
|
+
NDMzNjBmNmIwM2VlM2FlNWY4YjViOGY4MmRiZTI3NGYyODQ3MDI=
|
data/lib/etcd.rb
CHANGED
data/lib/etcd/client.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'openssl'
|
4
4
|
require 'net/http'
|
5
|
+
require 'net/https'
|
5
6
|
require 'json'
|
6
7
|
require 'etcd/log'
|
7
8
|
require 'etcd/stats'
|
@@ -17,6 +18,9 @@ module Etcd
|
|
17
18
|
# etcd api, like Etcd::Client#lock and Etcd::Client#eternal_watch, they
|
18
19
|
# are defined in separate modules and included in this class
|
19
20
|
class Client
|
21
|
+
|
22
|
+
extend Forwardable
|
23
|
+
|
20
24
|
HTTP_REDIRECT = ->(r) { r.is_a? Net::HTTPRedirection }
|
21
25
|
HTTP_SUCCESS = ->(r) { r.is_a? Net::HTTPSuccess }
|
22
26
|
HTTP_CLIENT_ERROR = ->(r) { r.is_a? Net::HTTPClientError }
|
@@ -26,9 +30,14 @@ module Etcd
|
|
26
30
|
include Mod::Lock
|
27
31
|
include Mod::Leader
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
Config = Struct.new(:use_ssl, :verify_mode, :read_timeout, :ssl_key, :ca_file,
|
34
|
+
:user_name, :password, :allow_redirect, :ssl_cert)
|
35
|
+
|
36
|
+
def_delegators :@config, :use_ssl, :verify_mode, :read_timeout
|
37
|
+
def_delegators :@config, :user_name, :password, :allow_redirect
|
38
|
+
|
39
|
+
|
40
|
+
attr_reader :host, :port, :http, :config
|
32
41
|
|
33
42
|
##
|
34
43
|
# Creates an Etcd::Client object. It accepts a hash +opts+ as argument
|
@@ -41,12 +50,15 @@ module Etcd
|
|
41
50
|
def initialize(opts = {})
|
42
51
|
@host = opts[:host] || '127.0.0.1'
|
43
52
|
@port = opts[:port] || 4001
|
44
|
-
@
|
45
|
-
@
|
46
|
-
@
|
47
|
-
@
|
48
|
-
@
|
49
|
-
@
|
53
|
+
@config = Config.new
|
54
|
+
@config.read_timeout = opts[:read_timeout] || 60
|
55
|
+
@config.allow_redirect = opts.key?(:allow_redirect) ? opts[:allow_redirect] : true
|
56
|
+
@config.use_ssl = opts[:use_ssl] || false
|
57
|
+
@config.verify_mode = opts.key?(:verify_mode) ? opts[:verify_mode] : OpenSSL::SSL::VERIFY_PEER
|
58
|
+
@config.user_name = opts[:user_name] || nil
|
59
|
+
@config.password = opts[:password] || nil
|
60
|
+
@config.allow_redirect = opts.key?(:allow_redirect) ? opts[:allow_redirect] : true
|
61
|
+
yield @config if block_given?
|
50
62
|
end
|
51
63
|
# rubocop:enable CyclomaticComplexity
|
52
64
|
|
@@ -94,8 +106,7 @@ module Etcd
|
|
94
106
|
timeout = options[:timeout] || @read_timeout
|
95
107
|
http = Net::HTTP.new(host, port)
|
96
108
|
http.read_timeout = timeout
|
97
|
-
http
|
98
|
-
http.verify_mode = verify_mode
|
109
|
+
setup_https(http)
|
99
110
|
req.basic_auth(user_name, password) if [user_name, password].all?
|
100
111
|
Log.debug("Invoking: '#{req.class}' against '#{path}")
|
101
112
|
res = http.request(req)
|
@@ -103,6 +114,23 @@ module Etcd
|
|
103
114
|
process_http_request(res, req, params)
|
104
115
|
end
|
105
116
|
|
117
|
+
def setup_https(http)
|
118
|
+
http.use_ssl = use_ssl
|
119
|
+
http.verify_mode = verify_mode
|
120
|
+
unless config.ssl_cert.nil?
|
121
|
+
Log.debug('Setting up ssl cert')
|
122
|
+
http.cert = config.ssl_cert
|
123
|
+
end
|
124
|
+
unless config.ssl_key.nil?
|
125
|
+
Log.debug('Setting up ssl key')
|
126
|
+
http.key = config.ssl_key
|
127
|
+
end
|
128
|
+
unless config.ca_file.nil?
|
129
|
+
Log.debug('Setting up ssl ca file to :' + config.ca_file)
|
130
|
+
http.ca_file = config.ca_file
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
106
134
|
# need to ahve original request to process the response when it redirects
|
107
135
|
def process_http_request(res, req = nil, params = nil)
|
108
136
|
case res
|
data/lib/etcd/node.rb
CHANGED
@@ -5,7 +5,7 @@ module Etcd
|
|
5
5
|
class Node
|
6
6
|
include Comparable
|
7
7
|
|
8
|
-
attr_reader :created_index, :modified_index, :expiration, :ttl, :key, :value
|
8
|
+
attr_reader :created_index, :modified_index, :expiration, :ttl, :key, :value, :dir
|
9
9
|
alias_method :createdIndex, :created_index
|
10
10
|
alias_method :modifiedIndex, :modified_index
|
11
11
|
|
data/lib/etcd/version.rb
CHANGED
data/spec/data/ca.crt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDxzCCAq+gAwIBAgIJAOHnywsV/TrCMA0GCSqGSIb3DQEBBQUAMHoxCzAJBgNV
|
3
|
+
BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtGb3N0ZXIgQ2l0
|
4
|
+
eTESMBAGA1UECgwJZXRjZC1ydWJ5MQswCQYDVQQDDAJDQTEfMB0GCSqGSIb3DQEJ
|
5
|
+
ARYQcmFuamliQGxpbnV4LmNvbTAeFw0xNDAzMTYwMjM2MjVaFw0xOTAzMTUwMjM2
|
6
|
+
MjVaMHoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQH
|
7
|
+
DAtGb3N0ZXIgQ2l0eTESMBAGA1UECgwJZXRjZC1ydWJ5MQswCQYDVQQDDAJDQTEf
|
8
|
+
MB0GCSqGSIb3DQEJARYQcmFuamliQGxpbnV4LmNvbTCCASIwDQYJKoZIhvcNAQEB
|
9
|
+
BQADggEPADCCAQoCggEBANf6jqt488XVaHDnXFT3KwXRuzs4fglJacRSXCjgfowN
|
10
|
+
QXgMawcycaX2/IZVk0FbQqiWZmS76ho5yaFny/GEHxKmeBchbLfciBbTWT6aJ5Kx
|
11
|
+
jDlLbMS9qZB+flV7dcUS+XYtNyDMAz52CnD5IvZSAXT0HADeATtZd49y9K6KE5Gc
|
12
|
+
2Mff2Rco6Fs1+r5Pg3LPitqq4xU56ezb8TM+bDlG0czrhrGCm4IuwspYDJYFhWk5
|
13
|
+
v85d9s5WxenJsJaGfAwV3+XbSRymr/JHWHUd/UR+iMvQ4qGd7JBI5UJU9IpM0zuT
|
14
|
+
EgZRptBoZfLolqArqZbbWhif5+qRRtjkpiVfNMqSsksCAwEAAaNQME4wHQYDVR0O
|
15
|
+
BBYEFPIzKQ+nceGu6RbzP9jCNaIPZvNKMB8GA1UdIwQYMBaAFPIzKQ+nceGu6Rbz
|
16
|
+
P9jCNaIPZvNKMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAJfbp690
|
17
|
+
nlbxr68RhAMtufqU9a+wBgh/U/Vlp5XlToCaDitdQToDkONuLnSx+sa2bnSg+gKs
|
18
|
+
dVNDYAat8jlJ6U3mIoC8zS7MPF0BCr9gXk7BQW/p0zZf0I62CbTkucBh5yE8WFB9
|
19
|
+
r7Z2UgpaJ6j95IVSRoVZ1gCbhKvN0o9dts4P8WD8ow3+kJ8n1wcPlZ5qvCzoDQNX
|
20
|
+
hJFE+vPN9UMP/oo4p/xzHJUysJcDwQ5k+Jqnl6wY289RibGaTfIFFWxqAKUVmxno
|
21
|
+
Ybkq5mZiXj0cs2lqw3zWYQ4xP6b50uECik+KZnBqYSmLP9s7d0qFgoA4ChFh5S1L
|
22
|
+
KY5mizc88rgPhlc=
|
23
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,85 @@
|
|
1
|
+
Certificate:
|
2
|
+
Data:
|
3
|
+
Version: 3 (0x2)
|
4
|
+
Serial Number: 1 (0x1)
|
5
|
+
Signature Algorithm: sha1WithRSAEncryption
|
6
|
+
Issuer: C=US, ST=California, L=Foster City, O=etcd-ruby, CN=CA/emailAddress=ranjib@linux.com
|
7
|
+
Validity
|
8
|
+
Not Before: Mar 17 04:27:53 2014 GMT
|
9
|
+
Not After : Mar 17 04:27:53 2015 GMT
|
10
|
+
Subject: C=US, ST=California, L=Foster City, O=etcd-ruby-client, CN=localhost/emailAddress=ranjib@linux.com
|
11
|
+
Subject Public Key Info:
|
12
|
+
Public Key Algorithm: rsaEncryption
|
13
|
+
Public-Key: (2048 bit)
|
14
|
+
Modulus:
|
15
|
+
00:dc:79:2c:aa:a0:6d:dd:09:72:29:6e:a2:67:a5:
|
16
|
+
15:dd:b6:27:e2:e1:4a:ae:4c:2e:19:52:b3:31:2c:
|
17
|
+
2b:8e:0b:62:bf:83:62:0e:a3:41:22:4c:6a:f1:84:
|
18
|
+
4d:8f:18:22:13:53:56:79:44:df:9f:b8:e1:05:a4:
|
19
|
+
7b:50:35:14:0c:9c:7c:40:ef:c3:27:1c:84:77:7c:
|
20
|
+
0a:5e:ef:e7:ac:97:85:3c:ec:aa:32:5b:30:37:10:
|
21
|
+
7b:2b:ab:ac:96:53:79:42:47:ff:5e:22:19:bb:c3:
|
22
|
+
50:da:3d:75:ae:14:fa:68:f7:e6:e0:d5:a0:2d:60:
|
23
|
+
0e:71:0b:a9:9f:ff:13:b7:d1:0f:e6:b9:e9:12:fa:
|
24
|
+
fb:ff:d7:a7:33:73:15:f7:1b:37:f1:2f:d7:4a:96:
|
25
|
+
46:c8:30:b9:4a:a6:29:9b:c5:7c:c4:a6:e2:b7:08:
|
26
|
+
74:2c:8f:25:0b:a9:a5:13:4f:03:e3:ae:d6:12:56:
|
27
|
+
1d:b5:9b:b0:32:f4:84:f9:59:1e:10:30:a9:7a:c0:
|
28
|
+
f2:75:6d:44:c1:2d:9a:f2:4e:1e:59:af:f2:30:8e:
|
29
|
+
12:8e:da:85:00:c3:c8:28:96:1e:59:98:49:a4:93:
|
30
|
+
87:0f:b5:e8:0c:95:90:a8:20:3d:43:26:67:4e:9a:
|
31
|
+
ee:ac:5e:0a:40:53:2b:99:4c:db:9d:72:20:25:04:
|
32
|
+
d4:ab
|
33
|
+
Exponent: 65537 (0x10001)
|
34
|
+
X509v3 extensions:
|
35
|
+
X509v3 Basic Constraints:
|
36
|
+
CA:FALSE
|
37
|
+
Netscape Comment:
|
38
|
+
OpenSSL Generated Certificate
|
39
|
+
X509v3 Subject Key Identifier:
|
40
|
+
3D:DA:77:1F:F0:A1:13:50:B4:CD:74:B3:45:90:F9:20:CB:EC:A1:79
|
41
|
+
X509v3 Authority Key Identifier:
|
42
|
+
keyid:F2:33:29:0F:A7:71:E1:AE:E9:16:F3:3F:D8:C2:35:A2:0F:66:F3:4A
|
43
|
+
|
44
|
+
X509v3 Extended Key Usage:
|
45
|
+
TLS Web Client Authentication
|
46
|
+
Signature Algorithm: sha1WithRSAEncryption
|
47
|
+
3e:a5:65:e2:2d:95:d0:1f:56:d4:07:67:37:fb:f4:e0:30:95:
|
48
|
+
fd:a0:d0:a0:29:2d:2b:c1:33:d8:76:02:c7:17:e0:4e:88:30:
|
49
|
+
26:4f:ec:99:b8:a6:0e:c4:e3:9f:3d:ce:fa:29:0b:58:51:a4:
|
50
|
+
14:9f:1b:5b:ce:91:72:04:ed:f9:ac:55:6e:72:fe:81:2f:30:
|
51
|
+
c1:3b:6f:75:9d:56:af:d6:12:66:4d:95:24:c1:b9:c7:da:98:
|
52
|
+
3f:9f:b1:ce:22:ba:f7:16:6a:37:e2:57:d1:b7:01:3b:30:7b:
|
53
|
+
30:60:f6:f6:10:37:ef:8e:d8:fa:13:33:dd:d1:99:b7:65:07:
|
54
|
+
b0:e4:b9:04:2f:28:3d:b1:cf:6b:01:1b:8c:fe:ac:f3:db:6e:
|
55
|
+
e9:86:19:de:2a:c9:eb:f4:ae:d0:93:72:14:03:4a:63:dc:8e:
|
56
|
+
c6:76:fa:0e:4f:be:91:3b:3c:7e:44:f0:07:b1:06:4d:a6:d5:
|
57
|
+
3b:c8:e3:4b:92:8f:43:1c:8b:e0:44:51:a0:55:1e:d9:33:23:
|
58
|
+
77:83:6e:90:4b:aa:3b:d5:57:ed:73:bd:7b:f6:be:0c:d5:76:
|
59
|
+
8e:ee:00:2d:ee:71:b5:f4:e0:ef:f5:2f:34:6e:25:ac:d2:2d:
|
60
|
+
9d:50:ec:df:b9:fd:39:4b:b7:60:85:24:45:ca:0e:54:73:92:
|
61
|
+
a7:d0:62:d8
|
62
|
+
-----BEGIN CERTIFICATE-----
|
63
|
+
MIIEEDCCAvigAwIBAgIBATANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJVUzET
|
64
|
+
MBEGA1UECAwKQ2FsaWZvcm5pYTEUMBIGA1UEBwwLRm9zdGVyIENpdHkxEjAQBgNV
|
65
|
+
BAoMCWV0Y2QtcnVieTELMAkGA1UEAwwCQ0ExHzAdBgkqhkiG9w0BCQEWEHJhbmpp
|
66
|
+
YkBsaW51eC5jb20wHhcNMTQwMzE3MDQyNzUzWhcNMTUwMzE3MDQyNzUzWjCBiDEL
|
67
|
+
MAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAcMC0Zvc3Rl
|
68
|
+
ciBDaXR5MRkwFwYDVQQKDBBldGNkLXJ1YnktY2xpZW50MRIwEAYDVQQDDAlsb2Nh
|
69
|
+
bGhvc3QxHzAdBgkqhkiG9w0BCQEWEHJhbmppYkBsaW51eC5jb20wggEiMA0GCSqG
|
70
|
+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDceSyqoG3dCXIpbqJnpRXdtifi4UquTC4Z
|
71
|
+
UrMxLCuOC2K/g2IOo0EiTGrxhE2PGCITU1Z5RN+fuOEFpHtQNRQMnHxA78MnHIR3
|
72
|
+
fApe7+esl4U87KoyWzA3EHsrq6yWU3lCR/9eIhm7w1DaPXWuFPpo9+bg1aAtYA5x
|
73
|
+
C6mf/xO30Q/muekS+vv/16czcxX3GzfxL9dKlkbIMLlKpimbxXzEpuK3CHQsjyUL
|
74
|
+
qaUTTwPjrtYSVh21m7Ay9IT5WR4QMKl6wPJ1bUTBLZryTh5Zr/IwjhKO2oUAw8go
|
75
|
+
lh5ZmEmkk4cPtegMlZCoID1DJmdOmu6sXgpAUyuZTNudciAlBNSrAgMBAAGjgZEw
|
76
|
+
gY4wCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQg
|
77
|
+
Q2VydGlmaWNhdGUwHQYDVR0OBBYEFD3adx/woRNQtM10s0WQ+SDL7KF5MB8GA1Ud
|
78
|
+
IwQYMBaAFPIzKQ+nceGu6RbzP9jCNaIPZvNKMBMGA1UdJQQMMAoGCCsGAQUFBwMC
|
79
|
+
MA0GCSqGSIb3DQEBBQUAA4IBAQA+pWXiLZXQH1bUB2c3+/TgMJX9oNCgKS0rwTPY
|
80
|
+
dgLHF+BOiDAmT+yZuKYOxOOfPc76KQtYUaQUnxtbzpFyBO35rFVucv6BLzDBO291
|
81
|
+
nVav1hJmTZUkwbnH2pg/n7HOIrr3Fmo34lfRtwE7MHswYPb2EDfvjtj6EzPd0Zm3
|
82
|
+
ZQew5LkELyg9sc9rARuM/qzz227phhneKsnr9K7Qk3IUA0pj3I7GdvoOT76ROzx+
|
83
|
+
RPAHsQZNptU7yONLko9DHIvgRFGgVR7ZMyN3g26QS6o71Vftc7179r4M1XaO7gAt
|
84
|
+
7nG19ODv9S80biWs0i2dUOzfuf05S7dghSRFyg5Uc5Kn0GLY
|
85
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,28 @@
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
2
|
+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDceSyqoG3dCXIp
|
3
|
+
bqJnpRXdtifi4UquTC4ZUrMxLCuOC2K/g2IOo0EiTGrxhE2PGCITU1Z5RN+fuOEF
|
4
|
+
pHtQNRQMnHxA78MnHIR3fApe7+esl4U87KoyWzA3EHsrq6yWU3lCR/9eIhm7w1Da
|
5
|
+
PXWuFPpo9+bg1aAtYA5xC6mf/xO30Q/muekS+vv/16czcxX3GzfxL9dKlkbIMLlK
|
6
|
+
pimbxXzEpuK3CHQsjyULqaUTTwPjrtYSVh21m7Ay9IT5WR4QMKl6wPJ1bUTBLZry
|
7
|
+
Th5Zr/IwjhKO2oUAw8golh5ZmEmkk4cPtegMlZCoID1DJmdOmu6sXgpAUyuZTNud
|
8
|
+
ciAlBNSrAgMBAAECggEAAeTcmF6mcvaoz2hO5tsJNA1jjFRpItQutTL7rRl3ClJY
|
9
|
+
t9J2HjAS2CuV45tCW09Ww5m8rXAFB8c7z6OZF5hNIsqZWql0oLpi/O/I2wXulJH8
|
10
|
+
qAhUcfhMkryGglqIMgZnjUU3EWTzmaRU5nsOrr8pY4t1pUrQhHNFzHzQKTq0vah/
|
11
|
+
CGWU4vd/F4P6NAuIhaWFbjkPJcKc/bNjGaoo/mh0JVlHzlA7soPmRr3Ki2ucHVsy
|
12
|
+
n24QApG+XULuJCUOV6EhaUFvKkCziId4xFoMqwAzzZ2sUiYt9+ftpZ9fB7Q6KcW0
|
13
|
+
MftW0P6ox3cTL/6HJ8gdHoQVDo/692kJAfWwaoKEyQKBgQDxRzx8OfCcXtMrB1D0
|
14
|
+
+dT9Do0sbaXY5MY59S1maCvbpDL/jApttSMM+R0BugKtTQjYykLYSKrRhp8JDOPO
|
15
|
+
L/XJ+7azfw01IduVvRE5auKwJohS1DJx1NexDF2OMKBOLVffbBdweHIwKDNde9ki
|
16
|
+
+ws1PJTrNcXTr+uoZ0BBDtg33wKBgQDp7PcoZHYcyBdBgUiFZdZWSLjHl3pRjcJY
|
17
|
+
qQT3sHDomweYx9kwafbf2iKPs0KLzfsHdFMvT/Og1Ks9mD9vZMoWVxia9J3/mlD5
|
18
|
+
66imnXfcuN432kIqxwY2PArLsUOGJs9zCTr6Yed1XBHdBNEQWVmox+g8TdTyVZlk
|
19
|
+
xu3zANUstQKBgG+/D3t1lkPGA0VteQhM4WFmqOnHysUeh9R2AlXor09lyBzlLjtL
|
20
|
+
ZnVutwmCrhS3lf5aBwWG+l5aXDPj3Wo0ekDXLPILSQGvsbSzQVP3dhAheIfsMYTZ
|
21
|
+
ECC22mmticFLbORUerKjhjdZlxiX8KQr4y//4/TgDcSSOLHhSDgZePi/AoGAE6j6
|
22
|
+
zMZEtv6KFdNLyQpaDT5naT7t5NTJNLJf3IFTu/jrloeVVWBSg1XN+c3TFfTl2CaK
|
23
|
+
pztM+oNlMPQOwMnzwhTn2H4emVDa5WZM8lPhswdGheMuFHJNr1k0fxIS3r98R+rK
|
24
|
+
rih0T4TBa5XwDDO2OV0zw323G/bdwX6GmRnE0NECgYAZL+Nyz6kTvRhv4o68hubR
|
25
|
+
3XmxgtGA8mQWq88aYN9xBvO4S5ixxV5qqWDVrKf7qdTerDkvTcEeDQ4ERdojQau5
|
26
|
+
HSppZrGs7ARsGvWOvSInXE2SNl8YjKKNqOD4SEAQy2xjblP9EAFmTaAG9RtUQFn9
|
27
|
+
MO7HMeev/i1iRK6q7OXZeg==
|
28
|
+
-----END PRIVATE KEY-----
|
@@ -0,0 +1,83 @@
|
|
1
|
+
Certificate:
|
2
|
+
Data:
|
3
|
+
Version: 3 (0x2)
|
4
|
+
Serial Number: 2 (0x2)
|
5
|
+
Signature Algorithm: sha1WithRSAEncryption
|
6
|
+
Issuer: C=US, ST=California, L=Foster City, O=etcd-ruby, CN=CA/emailAddress=ranjib@linux.com
|
7
|
+
Validity
|
8
|
+
Not Before: Mar 16 02:48:04 2014 GMT
|
9
|
+
Not After : Mar 16 02:48:04 2015 GMT
|
10
|
+
Subject: C=US, ST=California, L=Foster City, O=Default Company Ltd, CN=localhost/emailAddress=ranjib@linux.com
|
11
|
+
Subject Public Key Info:
|
12
|
+
Public Key Algorithm: rsaEncryption
|
13
|
+
Public-Key: (2048 bit)
|
14
|
+
Modulus:
|
15
|
+
00:d3:d7:3f:b2:88:6b:48:c3:1f:ae:70:cf:a5:ec:
|
16
|
+
71:1a:f0:3c:82:4f:29:84:d4:f9:01:d1:4e:b4:ba:
|
17
|
+
cf:72:88:06:55:01:c5:f6:83:d1:34:cf:3c:8b:40:
|
18
|
+
1c:eb:0e:36:93:d4:08:2a:b3:1b:55:42:a2:12:40:
|
19
|
+
b5:c0:a1:51:22:9c:95:19:22:3e:a6:52:b9:5f:d9:
|
20
|
+
04:45:bb:e6:95:13:61:7c:54:8e:17:07:f8:23:4c:
|
21
|
+
e7:dd:61:bc:71:78:5a:7e:c6:ae:1a:ec:05:b4:02:
|
22
|
+
96:b4:ca:16:5a:50:25:e1:9d:df:ae:41:39:ff:64:
|
23
|
+
d3:33:87:53:36:51:68:8f:fe:92:9d:a7:02:53:be:
|
24
|
+
c8:be:bd:13:c0:34:d6:d4:a9:0a:84:9d:53:4e:37:
|
25
|
+
42:57:70:5b:eb:5f:97:36:3c:1b:30:77:83:61:d9:
|
26
|
+
43:ee:9a:8f:c4:40:13:ef:b2:d2:42:d2:85:f5:ca:
|
27
|
+
bb:92:8e:a6:85:9d:b5:fd:7b:6e:a9:46:33:35:5c:
|
28
|
+
13:8d:71:9d:dd:7e:96:a2:da:98:c4:cc:33:00:aa:
|
29
|
+
a4:fc:41:b0:cb:80:13:57:19:d7:36:06:bc:d3:58:
|
30
|
+
3c:ab:31:e6:db:3d:8b:52:bb:c2:97:22:72:8e:c2:
|
31
|
+
b8:9e:4a:a8:22:96:6f:9f:9d:a4:f5:8f:15:7d:9f:
|
32
|
+
91:2b
|
33
|
+
Exponent: 65537 (0x10001)
|
34
|
+
X509v3 extensions:
|
35
|
+
X509v3 Basic Constraints:
|
36
|
+
CA:FALSE
|
37
|
+
Netscape Comment:
|
38
|
+
OpenSSL Generated Certificate
|
39
|
+
X509v3 Subject Key Identifier:
|
40
|
+
B1:24:B6:2E:99:A8:14:D8:86:84:FB:0B:26:A7:64:3B:29:59:B6:D9
|
41
|
+
X509v3 Authority Key Identifier:
|
42
|
+
keyid:F2:33:29:0F:A7:71:E1:AE:E9:16:F3:3F:D8:C2:35:A2:0F:66:F3:4A
|
43
|
+
|
44
|
+
Signature Algorithm: sha1WithRSAEncryption
|
45
|
+
0e:a1:12:ce:cb:db:64:d3:61:a2:0e:0b:93:ea:16:7b:91:6f:
|
46
|
+
af:a6:0a:e8:bf:b5:a7:4a:60:41:fc:cc:d6:bb:8b:4c:00:f3:
|
47
|
+
08:c6:31:41:57:7e:66:53:1e:41:93:e7:e2:62:e5:d6:9a:93:
|
48
|
+
ca:ef:b6:d1:1e:3d:ec:e4:fe:8e:1b:ac:4d:ef:16:56:09:8c:
|
49
|
+
d5:1a:30:c9:2f:13:1d:47:17:6e:67:26:9d:75:a1:9d:94:41:
|
50
|
+
f9:3e:b6:de:f5:e9:76:87:dc:c7:a9:d6:37:47:52:bf:2a:59:
|
51
|
+
48:72:56:f0:89:d5:83:9c:35:f3:37:48:02:52:4a:a0:52:92:
|
52
|
+
fe:65:6b:7b:ce:57:0c:9b:93:56:48:86:c5:db:4f:df:dd:d4:
|
53
|
+
ac:9f:31:39:77:7b:3a:aa:f5:d8:95:db:28:e6:1b:47:9d:18:
|
54
|
+
c5:b2:38:88:2a:8a:5d:11:9d:aa:26:aa:8c:06:8a:20:b1:70:
|
55
|
+
7e:2b:dd:fa:12:7b:32:64:c6:5b:54:d6:4a:aa:fb:a4:22:35:
|
56
|
+
6b:69:9f:c6:c2:58:e7:79:6f:a6:4b:f5:25:64:55:ce:2f:69:
|
57
|
+
52:76:1c:33:9e:97:3d:f5:f7:2c:67:29:30:55:86:65:5a:9a:
|
58
|
+
7c:9c:79:80:f6:14:e3:8b:35:fb:7d:c9:a8:c0:86:24:07:9d:
|
59
|
+
0d:c2:69:70
|
60
|
+
-----BEGIN CERTIFICATE-----
|
61
|
+
MIID/DCCAuSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJVUzET
|
62
|
+
MBEGA1UECAwKQ2FsaWZvcm5pYTEUMBIGA1UEBwwLRm9zdGVyIENpdHkxEjAQBgNV
|
63
|
+
BAoMCWV0Y2QtcnVieTELMAkGA1UEAwwCQ0ExHzAdBgkqhkiG9w0BCQEWEHJhbmpp
|
64
|
+
YkBsaW51eC5jb20wHhcNMTQwMzE2MDI0ODA0WhcNMTUwMzE2MDI0ODA0WjCBizEL
|
65
|
+
MAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAcMC0Zvc3Rl
|
66
|
+
ciBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMRIwEAYDVQQDDAls
|
67
|
+
b2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEHJhbmppYkBsaW51eC5jb20wggEiMA0G
|
68
|
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDT1z+yiGtIwx+ucM+l7HEa8DyCTymE
|
69
|
+
1PkB0U60us9yiAZVAcX2g9E0zzyLQBzrDjaT1AgqsxtVQqISQLXAoVEinJUZIj6m
|
70
|
+
Urlf2QRFu+aVE2F8VI4XB/gjTOfdYbxxeFp+xq4a7AW0Apa0yhZaUCXhnd+uQTn/
|
71
|
+
ZNMzh1M2UWiP/pKdpwJTvsi+vRPANNbUqQqEnVNON0JXcFvrX5c2PBswd4Nh2UPu
|
72
|
+
mo/EQBPvstJC0oX1yruSjqaFnbX9e26pRjM1XBONcZ3dfpai2pjEzDMAqqT8QbDL
|
73
|
+
gBNXGdc2BrzTWDyrMebbPYtSu8KXInKOwrieSqgilm+fnaT1jxV9n5ErAgMBAAGj
|
74
|
+
ezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk
|
75
|
+
IENlcnRpZmljYXRlMB0GA1UdDgQWBBSxJLYumagU2IaE+wsmp2Q7KVm22TAfBgNV
|
76
|
+
HSMEGDAWgBTyMykPp3HhrukW8z/YwjWiD2bzSjANBgkqhkiG9w0BAQUFAAOCAQEA
|
77
|
+
DqESzsvbZNNhog4Lk+oWe5Fvr6YK6L+1p0pgQfzM1ruLTADzCMYxQVd+ZlMeQZPn
|
78
|
+
4mLl1pqTyu+20R497OT+jhusTe8WVgmM1RowyS8THUcXbmcmnXWhnZRB+T623vXp
|
79
|
+
dofcx6nWN0dSvypZSHJW8InVg5w18zdIAlJKoFKS/mVre85XDJuTVkiGxdtP393U
|
80
|
+
rJ8xOXd7Oqr12JXbKOYbR50YxbI4iCqKXRGdqiaqjAaKILFwfivd+hJ7MmTGW1TW
|
81
|
+
Sqr7pCI1a2mfxsJY53lvpkv1JWRVzi9pUnYcM56XPfX3LGcpMFWGZVqafJx5gPYU
|
82
|
+
44s1+33JqMCGJAedDcJpcA==
|
83
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,28 @@
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
2
|
+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDT1z+yiGtIwx+u
|
3
|
+
cM+l7HEa8DyCTymE1PkB0U60us9yiAZVAcX2g9E0zzyLQBzrDjaT1AgqsxtVQqIS
|
4
|
+
QLXAoVEinJUZIj6mUrlf2QRFu+aVE2F8VI4XB/gjTOfdYbxxeFp+xq4a7AW0Apa0
|
5
|
+
yhZaUCXhnd+uQTn/ZNMzh1M2UWiP/pKdpwJTvsi+vRPANNbUqQqEnVNON0JXcFvr
|
6
|
+
X5c2PBswd4Nh2UPumo/EQBPvstJC0oX1yruSjqaFnbX9e26pRjM1XBONcZ3dfpai
|
7
|
+
2pjEzDMAqqT8QbDLgBNXGdc2BrzTWDyrMebbPYtSu8KXInKOwrieSqgilm+fnaT1
|
8
|
+
jxV9n5ErAgMBAAECggEAMExdK3lK7JYAPSdfUHct+nRXd2ZREwXzl+R+y1nkPjqh
|
9
|
+
JvR2jBPVuPKe3SjK7xSYgO/QxNt9Gd1NUlgKmFavRvLoU4ipPAaUWTQDc1q54bc/
|
10
|
+
fLdShhG9E19PZfwImN5V0528yEqTqk0Ey0df/UtUt7Hk87fPX1k/hfoOkM3SxzFb
|
11
|
+
SUF+KjwGfUj1uY0s4mFjrikAtITU+fZWiC3yw4V3BaeISxuArXtwvd6j1Pr7UUQI
|
12
|
+
p6TAI8Xo49ZbvD7z/QxlOZM/FdvcZiW/74sxyOAP/e0bsQ0mzfTW3pFE1y2UHGyD
|
13
|
+
RQPJoUzbcl2OyjjCPLT9bgBj+HMXo8nrkW774apggQKBgQDt8eUo0Pc7OV4C/Yyp
|
14
|
+
dJ8QI2+7sROPweIa8thnzcX/bdBASelsUfs/neTgCUCXlXkrXyoVPZKSvyZg7fWU
|
15
|
+
w3uYspoC2m3Lr3XEqfRqeVaYO9AtAgYdbkfSmg63WOgalcckJDnGlvRKm/Sh+QRj
|
16
|
+
1MwGZDTnTflecTtPpLxmdxIdCwKBgQDj6kdtgnfFAlknidQqx0++AsxdgdZnDHhH
|
17
|
+
6vweSML1Ft6IpGVgsUhXszvSAlvh/jF4RKO8xGHNFtUXRNzqp1F4G781uMFgCkrq
|
18
|
+
5UecLx/Jv2LjMUiQmpiPWruANitbyjeiC0knV1RgWsqIwVm02zb5/y9icrKnLpAf
|
19
|
+
mRSFJEGwYQKBgQC/AO5zVUsgv2w3+lBvtq34xnlqsTqCq6BVAZu1t/i4ke4ZrTsz
|
20
|
+
OJv29UhEjyjKhbI+nqWpZ0PBiK/GHz6DrGgKq1P19mEsoCxpMgSBc+WPTnRNrNI7
|
21
|
+
zcrZw9EMXNH0hUbWPD4krAht28MEQmDDwo4Ek2vkQTNsHHj/9b1Gg06HAQKBgQDB
|
22
|
+
YrBowyNNDskHO3PDOIr49vbhAKIjnfkRTNnP+H0z6Mu5tYQvnz167KH9d/LutvjS
|
23
|
+
y6sDKL6zfoQg0lWA5afC+ggsVS//hbw7w4AXjgSy8qm9jLu9tu9r89jU2SHBKLw7
|
24
|
+
ysevkfIOL/taPnUXeEoVpelW52ufX2r65LD8p971AQKBgQCJan1QX94RnThqPocH
|
25
|
+
NHQ2o20AV6vX/NZs4ydHADTrl+Kl2tK5ipfANe+iKZ54uSiPQRGQUFNA7+M3xcCU
|
26
|
+
2Us+bS8/E06NADQlIAuVSCOVmRDLDDXwhr3brjxZ/Xq/WjLyWim0HNZq+W6HhL25
|
27
|
+
149bGRGW4+GuqMEBR0jihvMh4A==
|
28
|
+
-----END PRIVATE KEY-----
|
@@ -4,8 +4,18 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Etcd basic auth client' do
|
6
6
|
|
7
|
+
before(:all) do
|
8
|
+
start_daemon(2)
|
9
|
+
end
|
10
|
+
after(:all) do
|
11
|
+
stop_daemon
|
12
|
+
end
|
13
|
+
|
7
14
|
let(:client) do
|
8
|
-
Etcd.client(
|
15
|
+
Etcd.client(host: 'localhost') do |config|
|
16
|
+
config.user_name = 'test'
|
17
|
+
config.password = 'pwd'
|
18
|
+
end
|
9
19
|
end
|
10
20
|
|
11
21
|
it '#user_name' do
|
data/spec/etcd/client_spec.rb
CHANGED
@@ -2,8 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::Client do
|
4
4
|
|
5
|
+
before(:all) do
|
6
|
+
start_daemon(3)
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:all) do
|
10
|
+
stop_daemon
|
11
|
+
end
|
12
|
+
|
5
13
|
let(:client) do
|
6
|
-
|
14
|
+
etcd_client
|
7
15
|
end
|
8
16
|
|
9
17
|
it 'should return the leader address' do
|
@@ -32,8 +40,7 @@ describe Etcd::Client do
|
|
32
40
|
it 'should redirect api request when allow_redirect is set' do
|
33
41
|
key = random_key
|
34
42
|
value = uuid.generate
|
35
|
-
|
36
|
-
resp = rd_client.set(key, value: value)
|
43
|
+
resp = client.set(key, value: value)
|
37
44
|
resp.node.key.should eql key
|
38
45
|
resp.node.value.should eql value
|
39
46
|
client.get(key).value.should eql resp.value
|
@@ -44,7 +51,7 @@ describe Etcd::Client do
|
|
44
51
|
before(:all) do
|
45
52
|
key = random_key
|
46
53
|
value = uuid.generate
|
47
|
-
@response =
|
54
|
+
@response = etcd_client.set(key, value: value)
|
48
55
|
end
|
49
56
|
|
50
57
|
it '#etcd_index' do
|
data/spec/etcd/keys_spec.rb
CHANGED
@@ -2,67 +2,105 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::Keys do
|
4
4
|
|
5
|
-
|
6
|
-
Etcd.client
|
7
|
-
end
|
8
|
-
|
9
|
-
it '#set/#get' do
|
10
|
-
key = random_key
|
11
|
-
value = uuid.generate
|
12
|
-
client.set(key, value: value)
|
13
|
-
expect(client.get(key).value).to eq(value)
|
14
|
-
end
|
5
|
+
shared_examples 'basic key operation' do
|
15
6
|
|
16
|
-
|
17
|
-
it 'should be true for existing keys' do
|
7
|
+
it '#set/#get' do
|
18
8
|
key = random_key
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
it 'should be true for existing keys' do
|
23
|
-
expect(client.exists?(random_key)).to be_false
|
9
|
+
value = uuid.generate
|
10
|
+
client.set(key, value: value)
|
11
|
+
expect(client.get(key).value).to eq(value)
|
24
12
|
end
|
25
|
-
end
|
26
13
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
context 'empty' do
|
34
|
-
it 'should be able to delete with dir flag' do
|
35
|
-
d = random_key
|
36
|
-
client.create(d, dir: true)
|
37
|
-
expect(client.delete(d, dir: true)).to be_true
|
14
|
+
context '#exists?' do
|
15
|
+
it 'should be true for existing keys' do
|
16
|
+
key = random_key
|
17
|
+
client.create(key, value: 10)
|
18
|
+
expect(client.exists?(key)).to be_true
|
38
19
|
end
|
39
|
-
|
40
|
-
|
41
|
-
d = random_key
|
42
|
-
client.create(d, dir: true)
|
43
|
-
client.create("#{d}/foobar", value: 10)
|
44
|
-
expect do
|
45
|
-
client.delete(d)
|
46
|
-
end.to raise_error(Etcd::NotFile)
|
20
|
+
it 'should be true for existing keys' do
|
21
|
+
expect(client.exists?(random_key)).to be_false
|
47
22
|
end
|
48
23
|
end
|
49
|
-
|
50
|
-
|
24
|
+
|
25
|
+
context 'directory' do
|
26
|
+
it 'should be able to create a directory' do
|
51
27
|
d = random_key
|
52
28
|
client.create(d, dir: true)
|
53
|
-
client.
|
54
|
-
expect do
|
55
|
-
client.delete(d, dir: true, recursive: true)
|
56
|
-
end.to_not raise_error
|
29
|
+
expect(client.get(d)).to be_true
|
57
30
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
31
|
+
context 'empty' do
|
32
|
+
it 'should be able to delete with dir flag' do
|
33
|
+
d = random_key
|
34
|
+
client.create(d, dir: true)
|
35
|
+
expect(client.delete(d, dir: true)).to be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should not be able to delete without dir flag' do
|
39
|
+
d = random_key
|
40
|
+
client.create(d, dir: true)
|
41
|
+
client.create("#{d}/foobar", value: 10)
|
42
|
+
expect do
|
43
|
+
client.delete(d)
|
44
|
+
end.to raise_error(Etcd::NotFile)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context 'not empty' do
|
48
|
+
it 'should be able to delete with recursive flag' do
|
49
|
+
d = random_key
|
50
|
+
client.create(d, dir: true)
|
51
|
+
client.create("#{d}/foobar")
|
52
|
+
expect do
|
53
|
+
client.delete(d, dir: true, recursive: true)
|
54
|
+
end.to_not raise_error
|
55
|
+
end
|
56
|
+
it 'should be not able to delete without recursive flag' do
|
57
|
+
d = random_key
|
58
|
+
client.create(d, dir: true)
|
59
|
+
client.create("#{d}/foobar")
|
60
|
+
expect do
|
61
|
+
client.delete(d, dir: true)
|
62
|
+
end.to raise_error(Etcd::DirNotEmpty)
|
63
|
+
end
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
67
|
+
|
68
|
+
context 'without ssl' do
|
69
|
+
before(:all) do
|
70
|
+
start_daemon
|
71
|
+
end
|
72
|
+
after(:all) do
|
73
|
+
stop_daemon
|
74
|
+
end
|
75
|
+
let(:client) do
|
76
|
+
etcd_client
|
77
|
+
end
|
78
|
+
it_should_behave_like 'basic key operation'
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with ssl' do
|
82
|
+
before(:all) do
|
83
|
+
start_daemon(1, use_ssl: true)
|
84
|
+
end
|
85
|
+
after(:all) do
|
86
|
+
stop_daemon
|
87
|
+
end
|
88
|
+
let(:client) do
|
89
|
+
etcd_ssl_client
|
90
|
+
end
|
91
|
+
it_should_behave_like 'basic key operation'
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'with ssl and client certificate' do
|
95
|
+
before(:all) do
|
96
|
+
start_daemon(1, use_ssl: true, check_client_cert: true )
|
97
|
+
end
|
98
|
+
after(:all) do
|
99
|
+
stop_daemon
|
100
|
+
end
|
101
|
+
let(:client) do
|
102
|
+
etcd_ssl_client_with_cert
|
103
|
+
end
|
104
|
+
it_should_behave_like 'basic key operation'
|
105
|
+
end
|
68
106
|
end
|
data/spec/etcd/leader_spec.rb
CHANGED
@@ -4,8 +4,16 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'mod leader' do
|
6
6
|
|
7
|
+
before(:all) do
|
8
|
+
start_daemon
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
stop_daemon
|
13
|
+
end
|
14
|
+
|
7
15
|
let(:client) do
|
8
|
-
|
16
|
+
etcd_client
|
9
17
|
end
|
10
18
|
|
11
19
|
it 'should allow setting a key value with ttl' do
|
data/spec/etcd/lock_spec.rb
CHANGED
data/spec/etcd/node_spec.rb
CHANGED
@@ -2,8 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::Node do
|
4
4
|
|
5
|
+
before(:all) do
|
6
|
+
start_daemon
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:all) do
|
10
|
+
stop_daemon
|
11
|
+
end
|
12
|
+
|
5
13
|
let(:client) do
|
6
|
-
|
14
|
+
etcd_client
|
7
15
|
end
|
8
16
|
|
9
17
|
it 'should create a directory with parent key when nested keys are set' do
|
data/spec/etcd/readme_spec.rb
CHANGED
@@ -4,6 +4,14 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Etcd specs for the main etcd README examples' do
|
6
6
|
|
7
|
+
before(:all) do
|
8
|
+
start_daemon
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
stop_daemon
|
13
|
+
end
|
14
|
+
|
7
15
|
let(:client) do
|
8
16
|
Etcd.client
|
9
17
|
end
|
@@ -55,7 +63,7 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
55
63
|
context 'set a key named "/message"' do
|
56
64
|
|
57
65
|
before(:all) do
|
58
|
-
|
66
|
+
@response = etcd_client.set('/message', value: 'PinkFloyd')
|
59
67
|
end
|
60
68
|
|
61
69
|
it_should_behave_like 'response with valid http headers'
|
@@ -69,8 +77,8 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
69
77
|
context 'get a key named "/message"' do
|
70
78
|
|
71
79
|
before(:all) do
|
72
|
-
|
73
|
-
@response =
|
80
|
+
etcd_client.set('/message', value: 'PinkFloyd')
|
81
|
+
@response = etcd_client.get('/message')
|
74
82
|
end
|
75
83
|
|
76
84
|
it_should_behave_like 'response with valid http headers'
|
@@ -84,8 +92,8 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
84
92
|
context 'change the value of a key named "/message"' do
|
85
93
|
|
86
94
|
before(:all) do
|
87
|
-
|
88
|
-
@response =
|
95
|
+
etcd_client.set('/message', value: 'World')
|
96
|
+
@response = etcd_client.set('/message', value: 'PinkFloyd')
|
89
97
|
end
|
90
98
|
|
91
99
|
it_should_behave_like 'response with valid http headers'
|
@@ -99,9 +107,9 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
99
107
|
context 'delete a key named "/message"' do
|
100
108
|
|
101
109
|
before(:all) do
|
102
|
-
|
103
|
-
|
104
|
-
@response =
|
110
|
+
etcd_client.set('/message', value: 'World')
|
111
|
+
etcd_client.set('/message', value: 'PinkFloyd')
|
112
|
+
@response = etcd_client.delete('/message')
|
105
113
|
end
|
106
114
|
|
107
115
|
it 'should set the return action to SET' do
|
@@ -115,9 +123,9 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
115
123
|
context 'using ttl a key named "/message"' do
|
116
124
|
|
117
125
|
before(:all) do
|
118
|
-
|
126
|
+
etcd_client.set('/message', value: 'World')
|
119
127
|
@set_time = Time.now
|
120
|
-
@response =
|
128
|
+
@response = etcd_client.set('/message', value: 'PinkFloyd', ttl: 5)
|
121
129
|
end
|
122
130
|
|
123
131
|
it_should_behave_like 'response with valid http headers'
|
@@ -138,7 +146,7 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
138
146
|
it 'should throw exception after the expiration time' do
|
139
147
|
sleep 8
|
140
148
|
expect do
|
141
|
-
|
149
|
+
client.get('/message')
|
142
150
|
end.to raise_error
|
143
151
|
end
|
144
152
|
|
@@ -147,11 +155,12 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
147
155
|
context 'waiting for a change against a key named "/message"' do
|
148
156
|
|
149
157
|
before(:all) do
|
150
|
-
|
158
|
+
etcd_client.set('/message', value: 'foo')
|
151
159
|
thr = Thread.new do
|
152
|
-
@response =
|
160
|
+
@response = etcd_client.watch('/message')
|
153
161
|
end
|
154
|
-
|
162
|
+
sleep 1
|
163
|
+
etcd_client.set('/message', value: 'PinkFloyd')
|
155
164
|
thr.join
|
156
165
|
end
|
157
166
|
|
@@ -172,7 +181,7 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
172
181
|
context 'atomic in-order keys' do
|
173
182
|
|
174
183
|
before(:all) do
|
175
|
-
@response =
|
184
|
+
@response = etcd_client.create_in_order('/queue', value: 'PinkFloyd')
|
176
185
|
end
|
177
186
|
|
178
187
|
it_should_behave_like 'response with valid http headers'
|
@@ -212,7 +221,7 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
212
221
|
context 'directory with ttl' do
|
213
222
|
|
214
223
|
before(:all) do
|
215
|
-
@response =
|
224
|
+
@response = etcd_client.set('/directory', dir: true, ttl: 4)
|
216
225
|
end
|
217
226
|
|
218
227
|
it 'should create a directory' do
|
@@ -300,8 +309,8 @@ describe 'Etcd specs for the main etcd README examples' do
|
|
300
309
|
context 'hidden nodes' do
|
301
310
|
|
302
311
|
before(:all) do
|
303
|
-
|
304
|
-
|
312
|
+
etcd_client.set('/_message', value: 'Hello Hidden World')
|
313
|
+
etcd_client.set('/message', value: 'Hello World')
|
305
314
|
end
|
306
315
|
|
307
316
|
it 'should not be visible in directory listing' do
|
data/spec/etcd/stats_spec.rb
CHANGED
@@ -4,8 +4,16 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Etcd test_and_set' do
|
6
6
|
|
7
|
+
before(:all) do
|
8
|
+
start_daemon
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
stop_daemon
|
13
|
+
end
|
14
|
+
|
7
15
|
let(:client) do
|
8
|
-
|
16
|
+
etcd_client
|
9
17
|
end
|
10
18
|
|
11
19
|
it 'should pass when prev value is correct' do
|
data/spec/etcd/watch_spec.rb
CHANGED
@@ -4,8 +4,16 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe 'Etcd watch' do
|
6
6
|
|
7
|
+
before(:all) do
|
8
|
+
start_daemon
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
stop_daemon
|
13
|
+
end
|
14
|
+
|
7
15
|
let(:client) do
|
8
|
-
|
16
|
+
etcd_client
|
9
17
|
end
|
10
18
|
|
11
19
|
it 'without index, returns the value at a particular index' do
|
@@ -27,6 +35,7 @@ describe 'Etcd watch' do
|
|
27
35
|
thr = Thread.new do
|
28
36
|
response = client.watch(key)
|
29
37
|
end
|
38
|
+
sleep 2
|
30
39
|
client.set(key, value: value)
|
31
40
|
thr.join
|
32
41
|
expect(response.node.value).to eq(value)
|
data/spec/spec_helper.rb
CHANGED
@@ -6,12 +6,51 @@ $LOAD_PATH.unshift(File.expand_path('../spec', __FILE__))
|
|
6
6
|
require 'coco'
|
7
7
|
require 'uuid'
|
8
8
|
require 'etcd'
|
9
|
+
require 'singleton'
|
9
10
|
|
10
11
|
module Etcd
|
11
|
-
|
12
|
-
|
12
|
+
class Spawner
|
13
|
+
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@pids = []
|
18
|
+
@cert_file = File.expand_path('../data/server.crt', __FILE__)
|
19
|
+
@key_file = File.expand_path('../data/server.key', __FILE__)
|
20
|
+
@ca_cert = File.expand_path('../data/ca.crt', __FILE__)
|
21
|
+
end
|
22
|
+
|
23
|
+
def etcd_servers
|
24
|
+
@pids.size.times.inject([]){|servers, n| servers << "http://127.0.0.1:700#{n}" }
|
25
|
+
end
|
26
|
+
|
27
|
+
def start(numbers = 1, opts={})
|
28
|
+
raise "Already running etcd servers(#{@pids.inspect})" unless @pids.empty?
|
29
|
+
@tmpdir = Dir.mktmpdir
|
30
|
+
ssl_args = ""
|
31
|
+
ssl_args << " -cert-file=#{@cert_file} -key-file=#{@key_file}" if opts[:use_ssl]
|
32
|
+
ssl_args << " -ca-file=#{@ca_cert}" if opts[:check_client_cert]
|
33
|
+
@pids << daemonize(@tmpdir, ssl_args)
|
34
|
+
(numbers - 1).times do |n|
|
35
|
+
@pids << daemonize(@tmpdir, ssl_args)
|
36
|
+
end
|
37
|
+
end
|
13
38
|
|
14
|
-
def
|
39
|
+
def daemonize(dir, ssl_args)
|
40
|
+
client_port = 4001 + @pids.size
|
41
|
+
server_port = 7001 + @pids.size
|
42
|
+
leader = '127.0.0.1:7001'
|
43
|
+
args = " -addr 127.0.0.1:#{client_port} -peer-addr 127.0.0.1:#{server_port}"
|
44
|
+
args << " -data-dir #{dir + client_port.to_s} -name node_#{client_port}"
|
45
|
+
command = etcd_binary + args + ssl_args
|
46
|
+
command << " -peers #{leader}" unless @pids.empty? # if pids are not empty, theres a daemon already
|
47
|
+
pid = spawn(command, out: '/dev/null')
|
48
|
+
sleep 1
|
49
|
+
Process.detach(pid)
|
50
|
+
pid
|
51
|
+
end
|
52
|
+
|
53
|
+
def etcd_binary
|
15
54
|
if File.exists? './etcd/bin/etcd'
|
16
55
|
'./etcd/bin/etcd'
|
17
56
|
elsif !!ENV['ETCD_BIN']
|
@@ -21,37 +60,23 @@ module Etcd
|
|
21
60
|
end
|
22
61
|
end
|
23
62
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
@@pids = Array(pid)
|
28
|
-
leader = '127.0.0.1:7001'
|
29
|
-
4.times do |n|
|
30
|
-
client_port = 4002 + n
|
31
|
-
server_port = 7002 + n
|
32
|
-
pid = spawn_etcd_server(@@tmpdir + client_port.to_s, client_port, server_port, leader)
|
33
|
-
@@pids << pid
|
63
|
+
def stop
|
64
|
+
@pids.each do |pid|
|
65
|
+
Process.kill('TERM', pid)
|
34
66
|
end
|
67
|
+
FileUtils.remove_entry_secure(@tmpdir, true)
|
68
|
+
@pids.clear
|
35
69
|
end
|
70
|
+
end
|
36
71
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
FileUtils.remove_entry_secure(@@tmpdir, true)
|
72
|
+
module SpecHelper
|
73
|
+
|
74
|
+
def start_daemon(numbers = 1, opts={})
|
75
|
+
Spawner.instance.start(numbers, opts)
|
42
76
|
end
|
43
77
|
|
44
|
-
def
|
45
|
-
|
46
|
-
command = if leader.nil?
|
47
|
-
etcd_binary + args
|
48
|
-
else
|
49
|
-
etcd_binary + args + " -peers #{leader}"
|
50
|
-
end
|
51
|
-
pid = spawn(command, out: '/dev/null')
|
52
|
-
Process.detach(pid)
|
53
|
-
sleep 1
|
54
|
-
pid
|
78
|
+
def stop_daemon
|
79
|
+
Spawner.instance.stop
|
55
80
|
end
|
56
81
|
|
57
82
|
def uuid
|
@@ -66,27 +91,41 @@ module Etcd
|
|
66
91
|
key
|
67
92
|
end
|
68
93
|
|
69
|
-
def
|
70
|
-
(
|
94
|
+
def etcd_ssl_client
|
95
|
+
Etcd.client(host: 'localhost') do |config|
|
96
|
+
config.use_ssl = true
|
97
|
+
config.ca_file = File.expand_path('../data/ca.crt', __FILE__)
|
98
|
+
end
|
71
99
|
end
|
72
100
|
|
73
|
-
def
|
101
|
+
def etcd_ssl_client
|
102
|
+
Etcd.client(host: 'localhost') do |config|
|
103
|
+
config.use_ssl = true
|
104
|
+
config.ca_file = File.expand_path('../data/ca.crt', __FILE__)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def etcd_ssl_client_with_cert
|
109
|
+
client_cert = File.expand_path('../data/client.crt', __FILE__)
|
110
|
+
client_key = File.expand_path('../data/client.key', __FILE__)
|
111
|
+
Etcd.client(host: 'localhost') do |config|
|
112
|
+
config.use_ssl = true
|
113
|
+
config.ca_file = File.expand_path('../data/ca.crt', __FILE__)
|
114
|
+
config.ssl_cert = OpenSSL::X509::Certificate.new(File.read(client_cert))
|
115
|
+
config.ssl_key = OpenSSL::PKey::RSA.new(File.read(client_key))
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def etcd_client
|
74
120
|
Etcd.client
|
75
121
|
end
|
76
122
|
|
77
123
|
def read_only_client
|
78
|
-
Etcd.client(allow_redirect: false, port:
|
124
|
+
Etcd.client(allow_redirect: false, port: 4002, host: 'localhost')
|
79
125
|
end
|
80
126
|
end
|
81
127
|
end
|
82
128
|
|
83
129
|
RSpec.configure do |c|
|
84
|
-
|
85
130
|
c.include Etcd::SpecHelper
|
86
|
-
c.before(:suite) do
|
87
|
-
Etcd::SpecHelper.start_etcd_servers
|
88
|
-
end
|
89
|
-
c.after(:suite) do
|
90
|
-
Etcd::SpecHelper.stop_etcd_servers
|
91
|
-
end
|
92
131
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etcd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ranjib Dey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mixlib-log
|
@@ -110,6 +110,11 @@ files:
|
|
110
110
|
- lib/etcd/response.rb
|
111
111
|
- lib/etcd/stats.rb
|
112
112
|
- lib/etcd/version.rb
|
113
|
+
- spec/data/ca.crt
|
114
|
+
- spec/data/client.crt
|
115
|
+
- spec/data/client.key
|
116
|
+
- spec/data/server.crt
|
117
|
+
- spec/data/server.key
|
113
118
|
- spec/etcd/basic_auth_client_spec.rb
|
114
119
|
- spec/etcd/client_spec.rb
|
115
120
|
- spec/etcd/keys_spec.rb
|
@@ -147,6 +152,11 @@ signing_key:
|
|
147
152
|
specification_version: 4
|
148
153
|
summary: Ruby client library for etcd
|
149
154
|
test_files:
|
155
|
+
- spec/data/ca.crt
|
156
|
+
- spec/data/client.crt
|
157
|
+
- spec/data/client.key
|
158
|
+
- spec/data/server.crt
|
159
|
+
- spec/data/server.key
|
150
160
|
- spec/etcd/basic_auth_client_spec.rb
|
151
161
|
- spec/etcd/client_spec.rb
|
152
162
|
- spec/etcd/keys_spec.rb
|