class LeoManager::Client

Constants

CMD_ADD_BUCKET
CMD_COMPACT_RESUME
CMD_COMPACT_START
CMD_COMPACT_START_ALL
CMD_COMPACT_STATUS
CMD_COMPACT_SUSPEND
CMD_CRE_USER
CMD_DELETE_BUCKET
CMD_DEL_ENDPOINT
CMD_DEL_USER
CMD_DETACH
CMD_DU
CMD_GET_BUCKETS
CMD_GET_ENDPOINTS
CMD_GET_USERS
CMD_LOGIN
CMD_PURGE
CMD_REBALANCE
CMD_RECOVER_FILE
CMD_RECOVER_NODE
CMD_RECOVER_RING
CMD_RESUME
CMD_SET_ENDPOINT
CMD_START
CMD_STATUS
CMD_SUSPEND
CMD_UPDATE_ACL
CMD_UPD_USER_PASS
CMD_UPD_USER_ROLE
CMD_VERSION
CMD_WHEREIS
USER_ROLES

Attributes

current_server[R]

the server currently connected

servers[R]

servers to connect

Public Class Methods

new(*servers) click to toggle source

APIs

Constructor

# File lib/leo_manager_client.rb, line 71
def initialize(*servers)
  @servers = parse_servers(servers)
  set_current_server
  @mutex = Mutex.new
  connect
end

Public Instance Methods

add_bucket(bucket_name, access_key_id) click to toggle source

Add an Bucket in the system

Args

bucket_name :: a bucket name
access_key_id :: access key id

Return

Result
# File lib/leo_manager_client.rb, line 306
def add_bucket(bucket_name, access_key_id)
  Result.new(call(CMD_ADD_BUCKET % [bucket_name, access_key_id]))
end
compact_resume(node) click to toggle source

Execute 'compact suspend'

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 201
def compact_resume(node)
  Result.new(call(CMD_COMPACT_RESUME % node))
end
compact_start(node, num_of_targets_or_all, num_of_concurrents=nil) click to toggle source

Execute data comaction in a storage node

Args

node :: a storage node
num_of_targets_or_all :: a number of targets - [integer | all]
num_of_concurrents    :: a number of concurrents

Return

Result
# File lib/leo_manager_client.rb, line 177
def compact_start(node, num_of_targets_or_all, num_of_concurrents=nil)
  case num_of_targets_or_all.to_s
  when /^all$/i
    Result.new(call(CMD_COMPACT_START_ALL % node))
  else
    num_of_concurrents = num_of_concurrents ? Integer(num_of_concurrents) : ""
    Result.new(call(CMD_COMPACT_START % [node, Integer(num_of_targets_or_all), num_of_concurrents]))
  end
end
compact_status(node) click to toggle source

Execute 'compact status'

Args

node :: a storage node

Return

CompactionStatus
# File lib/leo_manager_client.rb, line 210
def compact_status(node)
  compaction = call(CMD_COMPACT_STATUS % node)[:compaction_status]
  CompactionStatus.new(compaction)
end
compact_suspend(node) click to toggle source

Execute 'compact suspend'

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 192
def compact_suspend(node)
  Result.new(call(CMD_COMPACT_SUSPEND % node))
end
create_user(user_id, password=nil) click to toggle source

Generate credential of a user

Args

user_id  :: user id
password :: password

Return

Credential
# File lib/leo_manager_client.rb, line 230
def create_user(user_id, password=nil)
  Credential.new(call(CMD_CRE_USER % [user_id, password]))
end
del_endpoint(endpoint)
Alias for: delete_endpoint
delete_bucket(bucket_name, access_key_id) click to toggle source

Delete an Bucket in the system

Args

bucket_name :: a bucket name
access_key_id :: access key id

Return

Result
# File lib/leo_manager_client.rb, line 316
def delete_bucket(bucket_name, access_key_id)
  Result.new(call(CMD_DELETE_BUCKET % [bucket_name, access_key_id]))
end
delete_endpoint(endpoint) click to toggle source

Remove an endpoint from the system

Args

endpoint :: an endpoint

Return

nil
# File lib/leo_manager_client.rb, line 287
def delete_endpoint(endpoint)
  Result.new(call(CMD_DEL_ENDPOINT % endpoint))
end
Also aliased as: del_endpoint
delete_user(user_id) click to toggle source

Delete a user

Args

user_id :: user id

Return

Result
# File lib/leo_manager_client.rb, line 261
def delete_user(user_id)
  Result.new(call(CMD_DEL_USER % user_id))
end
detach(node) click to toggle source

Leave a node from the storage cluster

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 122
def detach(node)
  Result.new(call(CMD_DETACH % node))
end
disconnect!() click to toggle source

Disconnect to LeoFS Manager explicitly

Return

Result
# File lib/leo_manager_client.rb, line 370
def disconnect!
  disconnect
end
du(node) click to toggle source

Retrieve storage status from the storage

Args

node :: a storage node

Return

StorageStat
# File lib/leo_manager_client.rb, line 166
def du(node)
  StorageStat.new(call(CMD_DU % node))
end
get_buckets() click to toggle source

Retrieve all buckets from the system

Return

Array of Bucket
# File lib/leo_manager_client.rb, line 323
def get_buckets
  buckets = call(CMD_GET_BUCKETS)[:buckets]
  buckets.map {|bucket| Bucket.new(bucket) }
end
get_endpoints() click to toggle source

Retrieve an endpoint in the system

Return

Array of Endpoint
# File lib/leo_manager_client.rb, line 295
def get_endpoints
  endpoints = call(CMD_GET_ENDPOINTS)[:endpoints]
  endpoints.map {|endpoint| Endpoint.new(endpoint) }
end
get_users() click to toggle source

Retrieve a user

Return

Map
# File lib/leo_manager_client.rb, line 268
def get_users
  users = call(CMD_GET_USERS)[:users]
  users.map {|account| User.new(account) }
end
login(user_id, password) click to toggle source

Login as specifies user

Args

user_id  :: user id
password :: password

Return

LoginInfo
# File lib/leo_manager_client.rb, line 106
def login(user_id, password)
  LoginInfo.new(call(CMD_LOGIN % [user_id, password]))
end
purge(path) click to toggle source

Purge a cache in the gateways

Args

path :: an object path

Return

Result
# File lib/leo_manager_client.rb, line 220
def purge(path)
  Result.new(call(CMD_PURGE % path))
end
rebalance() click to toggle source

Execute relocate of objects - “rebalance” in the storage cluster

Return

Result
# File lib/leo_manager_client.rb, line 147
def rebalance
  Result.new(call(CMD_REBALANCE))
end
recover_file(path) click to toggle source

Recover file

Args

path :: an object path

Return

Result
# File lib/leo_manager_client.rb, line 344
def recover_file(path)
  Result.new(call(CMD_RECOVER_FILE % path))
end
recover_node(node) click to toggle source

Recover node

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 353
def recover_node(node)
  Result.new(call(CMD_RECOVER_NODE % node))
end
recover_ring(node) click to toggle source

Recover ring

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 362
def recover_ring(node)
  Result.new(call(CMD_RECOVER_RING % node))
  nil
end
resume(node) click to toggle source

Resume a node in the storage cluster

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 140
def resume(node)
  Result.new(call(CMD_RESUME % node))
end
set_endpoint(endpoint) click to toggle source

Insert an endpoint in the system

Args

endpoint :: an endpoint

Return

Result
# File lib/leo_manager_client.rb, line 278
def set_endpoint(endpoint)
  Result.new(call(CMD_SET_ENDPOINT % endpoint))
end
start() click to toggle source

Launch LeoFS's storage cluster

Return

Result
# File lib/leo_manager_client.rb, line 113
def start
  Result.new(call(CMD_START))
end
status(node=nil) click to toggle source

Retrieve LeoFS's system status from LeoFS Manager

Args

node :: Node

Return

Status
# File lib/leo_manager_client.rb, line 96
def status(node=nil)
  Status.new(call(CMD_STATUS % node))
end
suspend(node) click to toggle source

Suspend a node in the storage cluster

Args

node :: a storage node

Return

Result
# File lib/leo_manager_client.rb, line 131
def suspend(node)
  Result.new(call(CMD_SUSPEND % node))
end
update_acl(bucket, accesskey, acl) click to toggle source

Update acl of a bucket

Args

bucket_name   :: a bucket name
access_key_id :: access key id
acl :: acl of a bucket

Return

Result
# File lib/leo_manager_client.rb, line 335
def update_acl(bucket, accesskey, acl)
  Result.new(call(CMD_UPDATE_ACL % [bucket, accesskey, acl]))
end
update_user_password(user_id, new_password) click to toggle source

Update password of a user

Args

user_id      :: user id
new_password :: new password

Return

Result
# File lib/leo_manager_client.rb, line 252
def update_user_password(user_id, new_password)
  Result.new(call(CMD_UPD_USER_PASS % [user_id, new_password]))
end
update_user_role(user_id, role) click to toggle source

Update role of a user

Args

user_id :: user id
role    :: operation role of a user

Return

Result
# File lib/leo_manager_client.rb, line 240
def update_user_role(user_id, role)
  role = role.to_sym if role.is_a? String
  role = USER_ROLES[role] if role.is_a? Symbol
  Result.new(call(CMD_UPD_USER_ROLE % [user_id, role]))
end
version() click to toggle source

Retrieve LeoFS's version from LeoFS Manager

Return

Version of LeoFS
# File lib/leo_manager_client.rb, line 86
def version
  h = call(CMD_VERSION)
  return h[:result]
end
whereis(path) click to toggle source

Retrieve assigned file information

Args

path :: an object path

Return

Array of AssignedFile
# File lib/leo_manager_client.rb, line 156
def whereis(path)
  assigned_info = call(CMD_WHEREIS % path)[:assigned_info]
  assigned_info.map {|h| AssignedFile.new(h)}
end

Private Instance Methods

call(command) click to toggle source

Send a request to LeoFS Manager

Return

Hash

# File lib/leo_manager_client.rb, line 434
def call(command)
  response = nil
  begin
    @mutex.synchronize do
      @socket.print "#{command}\r\n"
      line = @socket.readline
      warn line if $DEBUG
      response = JSON.parse(line, symbolize_names: true)
    end
  rescue EOFError => ex
    warn "EOFError occured (server: #{@current_server})"
    reconnect
  rescue => ex
    reconnect
    raise "An Error occured: #{ex.class} (server: #{@current_server})\n#{ex.message}"
  else
    raise response[:error] if response.has_key?(:error)
    return response
  end
end
connect() click to toggle source

Connect to LeoFS Manager

# File lib/leo_manager_client.rb, line 401
def connect
  retry_count = 0
  begin
    @socket = TCPSocket.new(@current_server[:host], @current_server[:port])
  rescue => ex
    warn "Faild to connect: #{ex.class} (server: #{@current_server})"
    warn ex.message
    retry_count += 1
    if retry_count > 3
      set_current_server
      warn "Connecting another server: #{@current_server}"
      retry_count = 0
    end
    sleep 1
    retry
  end
  @socket.autoclose = true
  nil
end
disconnect() click to toggle source
# File lib/leo_manager_client.rb, line 421
def disconnect
  @socket.close if @socket && !@socket.closed?
end
parse_servers(servers) click to toggle source

PRIVATE

# File lib/leo_manager_client.rb, line 379
def parse_servers(servers)
  servers.map do |server|
    if server.is_a? String
      m = server.match(/(?<host>.+):(?<port>[0-9]{1,5})/)
      host = m[:host]
      port = Integer(m[:port])

      raise "Invalid Port Number: #{port}" unless 0 <= port && port <= 65535
      { :host => host, :port => port, :retry_count => 0 }
    else
      server
    end
  end
end
reconnect() click to toggle source
# File lib/leo_manager_client.rb, line 425
def reconnect
  disconnect
  sleep 1
  connect
end
set_current_server() click to toggle source
# File lib/leo_manager_client.rb, line 394
def set_current_server
  @servers.delete(@current_server) if @current_server
  raise "No servers to connect" if @servers.empty?
  @current_server = @servers.first
end