leofs_manager_client 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,52 @@
|
|
1
|
+
# ======================================================================
|
2
|
+
#
|
3
|
+
# LeoFS Manager Client
|
4
|
+
#
|
5
|
+
# Copyright (c) 2012 Rakuten, Inc.
|
6
|
+
#
|
7
|
+
# This file is provided to you under the Apache License,
|
8
|
+
# Version 2.0 (the "License"); you may not use this file
|
9
|
+
# except in compliance with the License. You may obtain
|
10
|
+
# a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing,
|
15
|
+
# software distributed under the License is distributed on an
|
16
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
17
|
+
# KIND, either express or implied. See the License for the
|
18
|
+
# specific language governing permissions and limitations
|
19
|
+
# under the License.
|
20
|
+
#
|
21
|
+
# ======================================================================
|
1
22
|
module LeoFSManager
|
2
|
-
|
3
|
-
## CLASS
|
4
|
-
## ======================================================================
|
5
|
-
## @doc System Information Model
|
6
|
-
##
|
23
|
+
# System Information Model
|
7
24
|
class Status
|
8
|
-
|
25
|
+
# Node
|
26
|
+
attr_reader :node_stat
|
27
|
+
# System
|
28
|
+
attr_reader :system_info
|
29
|
+
# Array of Node
|
30
|
+
attr_reader :node_list
|
31
|
+
|
32
|
+
def initialize(h)
|
33
|
+
@node_stat = Node.new(h[:node_stat]) if h.has_key?(:node_stat)
|
34
|
+
@system_info = System.new(h[:system_info]) if h.has_key?(:system_info)
|
35
|
+
@node_list = h[:node_list].map {|node| Node.new(node) } if h.has_key?(:node_list)
|
36
|
+
end
|
37
|
+
|
38
|
+
class System
|
39
|
+
attr_reader :version, :ring_size, :ring_cur, :ring_prev
|
40
|
+
|
41
|
+
# number of replicas
|
42
|
+
attr_reader :n
|
43
|
+
# number of replicas needed for a successful READ operation
|
44
|
+
attr_reader :r
|
45
|
+
# number of replicas needed for a successful WRITE operation
|
46
|
+
attr_reader :w
|
47
|
+
# number of replicas needed for a successful DELETE operation
|
48
|
+
attr_reader :d
|
49
|
+
|
9
50
|
def initialize(h)
|
10
51
|
@version = h[:version]
|
11
52
|
@n = h[:n]
|
@@ -16,99 +57,95 @@ module LeoFSManager
|
|
16
57
|
@ring_cur = h[:ring_cur]
|
17
58
|
@ring_prev = h[:ring_prev]
|
18
59
|
end
|
19
|
-
|
20
|
-
attr_reader :version, :n, :r, :w, :d, :ring_size, :ring_cur, :ring_prev
|
21
60
|
end
|
22
61
|
|
23
|
-
|
24
|
-
|
25
|
-
|
62
|
+
# Node Status Model
|
63
|
+
class Node
|
64
|
+
attr_reader :version, :type, :node, :state, :log_dir, :ring_cur, :ring_prev, :joined_at,
|
65
|
+
:tota_mem_usage, :system_mem_usage, :procs_mem_usage, :ets_mem_usage, :num_of_procs
|
66
|
+
|
26
67
|
def initialize(h)
|
68
|
+
@version = h[:version]
|
27
69
|
@type = h[:type]
|
28
70
|
@node = h[:node]
|
29
71
|
@state = h[:state]
|
30
|
-
@ring_cur = h[:ring_cur]
|
31
|
-
@ring_prev = h[:ring_prev]
|
32
|
-
@joined_at = h[:when]
|
33
|
-
end
|
34
|
-
|
35
|
-
attr_reader :type, :node, :state, :ring_cur, :ring_prev, :joined_at
|
36
|
-
end
|
37
|
-
|
38
|
-
## @doc Node Status Model
|
39
|
-
##
|
40
|
-
class NodeStat
|
41
|
-
def initialize(h)
|
42
|
-
@type = h[:version]
|
43
72
|
@log_dir = h[:log_dir]
|
44
73
|
@ring_cur = h[:ring_cur]
|
45
74
|
@ring_prev = h[:ring_prev]
|
75
|
+
@joined_at = h[:when]
|
46
76
|
@total_mem_usage = h[:total_mem_usage]
|
47
77
|
@system_mem_usage = h[:system_mem_usage]
|
48
78
|
@procs_mem_usage = h[:procs_mem_usage]
|
49
79
|
@ets_mem_usage = h[:ets_mem_usage]
|
50
80
|
@num_of_procs = h[:num_of_procs]
|
51
81
|
end
|
52
|
-
|
53
|
-
attr_reader :version, :log_dir, :ring_cur, :ring_prev, :tota_mem_usage,
|
54
|
-
:system_mem_usage, :procs_mem_usage, :ets_mem_usage, :num_of_procs
|
55
|
-
end
|
56
|
-
|
57
|
-
def initialize(h)
|
58
|
-
@node_stat = NodeStat.new(h[:node_stat]) if h.has_key?(:node_stat)
|
59
|
-
@system_info = SystemInfo.new(h[:system_info]) if h.has_key?(:system_info)
|
60
|
-
@node_list = h[:node_list].map {|node| NodeInfo.new(node) } if h.has_key?(:node_list)
|
61
82
|
end
|
62
|
-
|
63
|
-
attr_reader :node_stat, :system_info, :node_list
|
64
83
|
end
|
65
84
|
|
66
|
-
|
85
|
+
# Assigned file info Model
|
86
|
+
class AssignedFile
|
87
|
+
attr_reader :node, :vnode_id, :size, :clock, :checksum, :timestamp, :delete
|
88
|
+
|
67
89
|
def initialize(h)
|
68
|
-
@node
|
69
|
-
@vnode_id
|
70
|
-
@size
|
71
|
-
@clock
|
72
|
-
@checksum
|
90
|
+
@node = h[:node]
|
91
|
+
@vnode_id = h[:vnode_id]
|
92
|
+
@size = h[:size]
|
93
|
+
@clock = h[:clock]
|
94
|
+
@checksum = h[:checksum]
|
73
95
|
@timestamp = h[:timestamp]
|
74
|
-
@delete
|
96
|
+
@delete = h[:delete]
|
75
97
|
end
|
76
|
-
|
77
|
-
attr_reader :node, :vnode_id, :size, :clock, :checksum, :timestamp, :delete
|
78
98
|
end
|
79
99
|
|
80
|
-
|
100
|
+
# Storage Status Model
|
101
|
+
class StorageStat
|
102
|
+
attr_reader :file_size, :total_of_objects
|
103
|
+
|
81
104
|
def initialize(h)
|
82
105
|
@file_size = h[:file_size]
|
83
|
-
@total_of_objects = h[:total_of_objects]
|
106
|
+
@total_of_objects = h[:total_of_objects]
|
84
107
|
end
|
85
|
-
|
86
|
-
attr_reader :file_size, :total_of_objects
|
87
108
|
end
|
88
109
|
|
110
|
+
# S3 Credential
|
89
111
|
class Credential
|
112
|
+
# AWS_ACCESS_KEY_ID
|
113
|
+
attr_reader :access_key_id
|
114
|
+
# AWS_SECRET_ACCESS_KEY
|
115
|
+
attr_reader :secret_access_key
|
116
|
+
|
90
117
|
def initialize(h)
|
91
|
-
@access_key_id = h[:access_key_id]
|
118
|
+
@access_key_id = h[:access_key_id]
|
92
119
|
@secret_access_key = h[:secret_access_key]
|
93
120
|
end
|
94
|
-
|
95
|
-
attr_reader :access_key_id, :secret_access_key
|
96
121
|
end
|
97
122
|
|
123
|
+
# Endpoint
|
98
124
|
class Endpoint
|
125
|
+
# host of the endpoint
|
126
|
+
attr_reader :endpoint
|
127
|
+
# When the endpoint created at
|
128
|
+
attr_reader :created_at
|
129
|
+
|
99
130
|
def initialize(h)
|
100
131
|
@endpoint = h[:endpoint]
|
101
132
|
@created_at = h[:created_at]
|
102
133
|
end
|
103
|
-
|
104
|
-
attr_reader :endpoint, :created_at
|
105
134
|
end
|
106
135
|
|
136
|
+
# S3-Bucket Model
|
107
137
|
class Bucket
|
138
|
+
# name of bucket
|
139
|
+
attr_reader :name
|
140
|
+
# name of the bucket's owner
|
141
|
+
attr_reader :owner
|
142
|
+
# when the bucket created at
|
143
|
+
attr_reader :created_at
|
144
|
+
|
108
145
|
def initialize(h)
|
109
|
-
@name
|
110
|
-
@owner
|
111
|
-
@created_at =
|
146
|
+
@name = h[:bucket]
|
147
|
+
@owner = h[:owner]
|
148
|
+
@created_at = h[:created_at]
|
112
149
|
end
|
113
150
|
end
|
114
151
|
end
|
data/lib/leofs_manager_client.rb
CHANGED
@@ -26,13 +26,15 @@ require "time"
|
|
26
26
|
require_relative "leofs_manager_client/leofs_manager_models"
|
27
27
|
|
28
28
|
module LeoFSManager
|
29
|
-
VERSION = "0.2.
|
29
|
+
VERSION = "0.2.4"
|
30
30
|
|
31
|
+
# Class for close TCP socket on GC.
|
31
32
|
class Remover
|
32
33
|
def initialize(data)
|
33
34
|
@data = data
|
34
35
|
end
|
35
36
|
|
37
|
+
# it will be called on GC.
|
36
38
|
def call(*args)
|
37
39
|
socket = @data[0]
|
38
40
|
socket.close if socket && !socket.closed?
|
@@ -41,7 +43,6 @@ module LeoFSManager
|
|
41
43
|
end
|
42
44
|
|
43
45
|
class Client
|
44
|
-
## LeoFS-related commands:
|
45
46
|
CMD_VERSION = "version"
|
46
47
|
CMD_STATUS = "status %s"
|
47
48
|
CMD_START = "start"
|
@@ -60,131 +61,152 @@ module LeoFSManager
|
|
60
61
|
CMD_S3_ADD_BUCKET = "s3-add-bucket %s %s"
|
61
62
|
CMD_S3_GET_BUCKETS = "s3-get-buckets"
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
# ======================================================================
|
65
|
+
# APIs
|
66
|
+
# ======================================================================
|
67
|
+
# Constructor
|
68
|
+
#
|
68
69
|
def initialize(*servers)
|
69
70
|
@servers = parse_servers(servers)
|
70
71
|
set_current_server
|
71
72
|
final = Remover.new(@data = [])
|
72
73
|
ObjectSpace.define_finalizer(self, final)
|
73
|
-
@mutex = Mutex.new
|
74
74
|
connect
|
75
75
|
end
|
76
76
|
|
77
|
-
|
77
|
+
# servers to connect
|
78
|
+
attr_reader :servers
|
79
|
+
# the server currently connected
|
80
|
+
attr_reader :current_server
|
78
81
|
|
79
|
-
|
80
|
-
|
82
|
+
# Retrieve LeoFS's version from LeoFS Manager
|
83
|
+
# Return::
|
84
|
+
# Version of LeoFS
|
81
85
|
def version
|
82
86
|
h = sender(CMD_VERSION)
|
83
87
|
return h[:result]
|
84
88
|
end
|
85
89
|
|
86
|
-
|
87
|
-
|
90
|
+
# Retrieve LeoFS's system status from LeoFS Manager
|
91
|
+
# Return::
|
92
|
+
# Status
|
88
93
|
def status(node=nil)
|
89
94
|
Status.new(sender(CMD_STATUS % node))
|
90
95
|
end
|
91
96
|
|
92
|
-
|
93
|
-
|
97
|
+
# Launch LeoFS's storage cluster
|
98
|
+
# Return::
|
99
|
+
# _nil_
|
94
100
|
def start
|
95
101
|
sender(CMD_START)
|
96
102
|
nil
|
97
103
|
end
|
98
104
|
|
99
|
-
|
100
|
-
|
105
|
+
# Leave a node from the storage cluster
|
106
|
+
# Return::
|
107
|
+
# _nil_
|
101
108
|
def detach(node)
|
102
109
|
sender(CMD_DETACH % node)
|
103
110
|
nil
|
104
111
|
end
|
105
112
|
|
106
|
-
|
107
|
-
|
113
|
+
# Suspend a node in the storage cluster
|
114
|
+
# Return::
|
115
|
+
# _nil_
|
108
116
|
def suspend(node)
|
109
117
|
sender(CMD_SUSPEND % node)
|
110
118
|
nil
|
111
119
|
end
|
112
120
|
|
113
|
-
|
114
|
-
|
121
|
+
# Resume a node in the storage cluster
|
122
|
+
# Return::
|
123
|
+
# _nil_
|
115
124
|
def resume(node)
|
116
125
|
sender(CMD_RESUME % node)
|
117
126
|
nil
|
118
127
|
end
|
119
128
|
|
120
|
-
|
121
|
-
|
129
|
+
# Execute 'rebalance' in the storage cluster
|
130
|
+
# Return::
|
131
|
+
# _nil_
|
122
132
|
def rebalance
|
123
133
|
sender(CMD_REBALANCE)
|
124
134
|
nil
|
125
135
|
end
|
126
136
|
|
127
|
-
|
128
|
-
|
137
|
+
# Retrieve assigned file information
|
138
|
+
# Return::
|
139
|
+
# Array of AssignedFile
|
129
140
|
def whereis(path)
|
130
|
-
|
131
|
-
|
141
|
+
assigned_info = sender(CMD_WHEREIS % path)[:assigned_info]
|
142
|
+
assigned_info.map {|h| AssignedFile.new(h)}
|
132
143
|
end
|
133
144
|
|
134
|
-
|
135
|
-
|
145
|
+
# Retrieve storage status from the storage
|
146
|
+
# Return::
|
147
|
+
# StorageStat
|
136
148
|
def du(node)
|
137
|
-
|
149
|
+
StorageStat.new(sender(CMD_DU % node))
|
138
150
|
end
|
139
151
|
|
140
|
-
|
141
|
-
|
152
|
+
# Execute 'compaction'
|
153
|
+
# Return::
|
154
|
+
# _nil_
|
142
155
|
def compact(node)
|
143
156
|
sender(CMD_COMPACT % node)
|
144
157
|
nil
|
145
158
|
end
|
146
159
|
|
147
|
-
|
148
|
-
|
160
|
+
# Purge a cache in gateways
|
161
|
+
# Return::
|
162
|
+
# _nil_
|
149
163
|
def purge(path)
|
150
164
|
sender(CMD_PURGE % path)
|
151
165
|
nil
|
152
166
|
end
|
153
167
|
|
154
|
-
|
155
|
-
|
168
|
+
# Generate credential for LeoFS
|
169
|
+
# Return::
|
170
|
+
# Credential
|
156
171
|
def s3_gen_key(user_id)
|
157
172
|
Credential.new(sender(CMD_S3_GEN_KEY % user_id))
|
158
173
|
end
|
159
174
|
|
160
|
-
|
161
|
-
|
175
|
+
# Insert an endpoint in the system
|
176
|
+
# Return::
|
177
|
+
# _nil_
|
162
178
|
def s3_set_endpoint(endpoint)
|
163
179
|
sender(CMD_S3_SET_ENDPOINT % endpoint)
|
164
180
|
nil
|
165
181
|
end
|
166
182
|
|
167
|
-
|
168
|
-
|
183
|
+
# Remove an endpoint from the system
|
184
|
+
# Return::
|
185
|
+
# _nil_
|
169
186
|
def s3_del_endpoint(endpoint)
|
170
187
|
sender(CMD_S3_DEL_ENDPOINT % endpoint)
|
171
188
|
nil
|
172
189
|
end
|
173
190
|
|
174
|
-
|
175
|
-
|
191
|
+
# Retrieve an endpoint in the system
|
192
|
+
# Return::
|
193
|
+
# Array of Endpoint
|
176
194
|
def s3_get_endpoints
|
177
195
|
endpoints = sender(CMD_S3_GET_ENDPOINTS)[:endpoints]
|
178
196
|
endpoints.map {|endpoint| Endpoint.new(endpoint) }
|
179
197
|
end
|
180
|
-
|
198
|
+
|
199
|
+
# Add an Bucket in the system
|
200
|
+
# Return::
|
201
|
+
# _nil_
|
181
202
|
def s3_add_bucket(bucket_name, access_key_id)
|
182
203
|
sender(CMD_S3_ADD_BUCKET % [bucket_name, access_key_id])
|
183
204
|
nil
|
184
205
|
end
|
185
206
|
|
186
|
-
|
187
|
-
|
207
|
+
# Retrieve all buckets from the system
|
208
|
+
# Return::
|
209
|
+
# Array of Bucket
|
188
210
|
def s3_get_buckets
|
189
211
|
buckets = sender(CMD_S3_GET_BUCKETS)[:buckets]
|
190
212
|
buckets.map {|bucket| Bucket.new(bucket) }
|
@@ -210,15 +232,12 @@ module LeoFSManager
|
|
210
232
|
end
|
211
233
|
end
|
212
234
|
|
213
|
-
## @doc
|
214
|
-
##
|
215
235
|
def set_current_server
|
216
236
|
raise Error, "No servers to connect" if @servers.empty?
|
217
237
|
@current_server = @servers.first
|
218
238
|
end
|
219
239
|
|
220
|
-
|
221
|
-
##
|
240
|
+
# Connect to LeoFS Manager
|
222
241
|
def connect
|
223
242
|
retry_count = 0
|
224
243
|
begin
|
@@ -239,15 +258,13 @@ module LeoFSManager
|
|
239
258
|
end
|
240
259
|
end
|
241
260
|
|
242
|
-
|
243
|
-
|
261
|
+
# Send a request to LeoFS Manager
|
262
|
+
# Return::
|
263
|
+
# Hash
|
244
264
|
def sender(command)
|
245
265
|
begin
|
246
|
-
|
247
|
-
@
|
248
|
-
@socket.puts command
|
249
|
-
response = JSON.parse(@socket.gets, symbolize_names: true)
|
250
|
-
end
|
266
|
+
@socket.puts command
|
267
|
+
response = JSON.parse(@socket.gets, symbolize_names: true)
|
251
268
|
rescue => ex
|
252
269
|
raise "An Error occured: #{ex.class} (server: #{@current_server})\n#{ex.message}"
|
253
270
|
end
|
@@ -257,7 +274,7 @@ module LeoFSManager
|
|
257
274
|
end
|
258
275
|
end
|
259
276
|
|
260
|
-
|
277
|
+
# This section runs only when the file executed directly.
|
261
278
|
if __FILE__ == $PROGRAM_NAME
|
262
279
|
require "pp"
|
263
280
|
|
@@ -62,7 +62,7 @@ module Dummy
|
|
62
62
|
}.to_json
|
63
63
|
|
64
64
|
Whereis = {
|
65
|
-
:
|
65
|
+
:assigned_info => [
|
66
66
|
{
|
67
67
|
:node => "storage_0@127.0.0.1",
|
68
68
|
:vnode_id => "",
|
@@ -162,14 +162,14 @@ describe LeoFSManager do
|
|
162
162
|
end
|
163
163
|
|
164
164
|
it "returns SystemInfo" do
|
165
|
-
@manager.status.system_info.should be_a Status::
|
165
|
+
@manager.status.system_info.should be_a Status::System
|
166
166
|
end
|
167
167
|
|
168
168
|
it "returns node list" do
|
169
169
|
node_list = @manager.status.node_list
|
170
170
|
node_list.should be_a Array
|
171
171
|
node_list.each do |node|
|
172
|
-
node.should be_a Status::
|
172
|
+
node.should be_a Status::Node
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
@@ -179,14 +179,14 @@ describe LeoFSManager do
|
|
179
179
|
result = @manager.whereis("path")
|
180
180
|
result.should be_a Array
|
181
181
|
result.each do |where_info|
|
182
|
-
where_info.should be_a
|
182
|
+
where_info.should be_a AssignedFile
|
183
183
|
end
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
187
|
describe "#du" do
|
188
188
|
it "returns DiskUsage" do
|
189
|
-
@manager.du("node").should be_a
|
189
|
+
@manager.du("node").should be_a StorageStat
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leofs_manager_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-09-
|
13
|
+
date: 2012-09-27 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Client for LeoFS Manager
|
16
16
|
email:
|