class HrrRbNetconf::Server

Constants

SESSION_ID_MAX
SESSION_ID_MIN
SESSION_ID_MODULO
SESSION_ID_UNALLOCATED

Public Class Methods

new(datastore, capabilities: nil, strict_capabilities: false, enable_filter: true, logger: nil) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 25
def initialize datastore, capabilities: nil, strict_capabilities: false, enable_filter: true, logger: nil
  self.logger = logger
  @datastore = datastore
  @capabilities = capabilities || Capabilities.new(logger: logger)
  @strict_capabilities = strict_capabilities
  @enable_filter = enable_filter
  @mutex = Mutex.new
  @sessions = Hash.new
  @locks = Hash.new
  @lock_mutex = Mutex.new
  @last_session_id = SESSION_ID_MIN - 1
  @notification_streams = NotificationStreams.new
end

Public Instance Methods

allocate_session_id() click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 39
def allocate_session_id
  session_id = (SESSION_ID_MODULO).times.lazy.map{ |idx| (@last_session_id + 1 + idx - SESSION_ID_MIN) % SESSION_ID_MODULO + SESSION_ID_MIN }.reject{ |sid| @sessions.has_key? sid }.first
  unless session_id
    log_error { "Failed allocating Session ID" }
    raise "Failed allocating Session ID"
  end
  @last_session_id = session_id
end
close_session(session_id) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 77
def close_session session_id
  log_info { "Close session: Session ID: #{session_id}" }
  @sessions[session_id].close
end
delete_session(session_id) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 48
def delete_session session_id
  if @sessions.has_key? session_id
    @sessions.delete session_id
  end
end
event_match_stream?(event_xml, stream) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 123
def event_match_stream? event_xml, stream
  @notification_streams.event_match_stream? event_xml, stream
end
has_notification_stream?(stream) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 115
def has_notification_stream? stream
  @notification_streams.has_stream? stream
end
lock(target, session_id) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 82
def lock target, session_id
  log_info { "Lock: Target: #{target}, Session ID: #{session_id}" }
  @lock_mutex.synchronize do
    if @locks.has_key? target
      log_info { "Lock failed, lock is already held by session-id: #{@locks[target]}" }
      raise Error['lock-denied'].new('protocol', 'error', info: {'session-id' => @locks[target].to_s}, message: 'Lock failed, lock is already held', logger: logger)
    else
      @locks[target] = session_id
    end
  end
end
notification_stream(stream, replay_support: false, &blk) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 111
def notification_stream stream, replay_support: false, &blk
  @notification_streams.update stream, blk, replay_support
end
notification_stream_support_replay?(stream) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 119
def notification_stream_support_replay? stream
  @notification_streams.stream_support_replay? stream
end
send_notification(arg1, arg2=nil) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 127
def send_notification arg1, arg2=nil
  event_xml = NotificationEvent.new(arg1, arg2).to_xml
  matched_streams = @notification_streams.matched_streams event_xml
  log_info { "Send notification" }
  log_debug { "Event time: #{event_xml.elements['eventTime'].text}, Event: #{event_xml.elements.to_a}" }
  @sessions.each{ |session_id, session|
    session.filter_and_send_notification matched_streams, event_xml
  }
  log_info { "Send notification done" }
end
start_session(io) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 54
def start_session io
  log_info { "Start session" }
  session_id = SESSION_ID_UNALLOCATED
  begin
    @mutex.synchronize do
      session_id = allocate_session_id
      log_info { "Session ID: #{session_id}" }
      @sessions[session_id] = Session.new self, @capabilities, @datastore, session_id, io, @strict_capabilities, @enable_filter, logger: logger
    end
    @sessions[session_id].start
  rescue => e
    log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
  ensure
    @lock_mutex.synchronize do
      @locks.delete_if{ |tgt, sid| sid == session_id }
    end
    @mutex.synchronize do
      delete_session session_id
    end
    log_info { "Session closed: Session ID: #{session_id}" }
  end
end
unlock(target, session_id) click to toggle source
# File lib/hrr_rb_netconf/server.rb, line 94
def unlock target, session_id
  log_info { "Unlock: Target: #{target}, Session ID: #{session_id}" }
  @lock_mutex.synchronize do
    if @locks.has_key? target
      if @locks[target] == session_id
        @locks.delete target
      else
        log_info { "Unlock failed, lock is held by session-id: #{@locks[target]}" }
        raise Error['operation-failed'].new('protocol', 'error', logger: logger)
      end
    else
      log_info { "Unlock failed, lock is not held" }
      raise Error['operation-failed'].new('protocol', 'error', logger: logger)
    end
  end
end