class HrrRbNetconf::Server::Capability::Notification_1_0

Constants

DEPENDENCIES
ID
IF_FEATURES

Public Instance Methods

define_capability() click to toggle source
# File lib/hrr_rb_netconf/server/capability/notification_1_0.rb, line 14
def define_capability
  oper_proc('create-subscription'){ |session, datastore, input_e|
    stream_e = input_e.elements['stream']
    unless stream_e
      log_debug { "create-subscription doesn't have stream, so use NETCONF stream" }
      stream_e = input_e.add_element('stream')
      stream_e.text = 'NETCONF'
    end
    stream = stream_e.text
    start_time_e = input_e.elements['startTime']
    start_time = unless start_time_e
                   nil
                 else
                   DateTime.rfc3339(start_time_e.text)
                 end
    stop_time_e = input_e.elements['stopTime']
    stop_time = unless stop_time_e
                  nil
                else
                  DateTime.rfc3339(stop_time_e.text)
                end
    if ! session.subscription_creatable? stream
      log_error { "Not available stream: #{stream}" }
      raise Error['bad-element'].new('protocol', 'error', info: {'bad-element' => 'stream'}, logger: logger)
    end
    if start_time.nil? && stop_time
      log_error { "startTime element doesn't exist, but stopTime does" }
      raise Error['missing-element'].new('protocol', 'error', info: {'bad-element' => 'startTime'}, logger: logger)
    end
    if start_time && stop_time && (start_time > stop_time)
      log_error { "stopTime is earlier than startTime" }
      raise Error['bad-element'].new('protocol', 'error', info: {'bad-element' => 'stopTime'}, logger: logger)
    end
    if start_time && (start_time > DateTime.now)
      log_error { "startTime is later than current time" }
      raise Error['bad-element'].new('protocol', 'error', info: {'bad-element' => 'startTime'}, logger: logger)
    end
    begin
      events = datastore.run('create-subscription', input_e)
    rescue Error
      raise
    rescue => e
      log_error { "Exception in datastore.run('create-subscription', input_e): #{e.message}" }
      raise Error['operation-failed'].new('application', 'error', logger: logger)
    end
    begin
      if start_time
        session.notification_replay stream, start_time, stop_time, events
      end
    rescue Error
      raise
    rescue => e
      log_error { "Exception in session.notification_replay: #{e.message}" }
      raise Error['operation-failed'].new('protocol', 'error', logger: logger)
    end
    session.create_subscription stream, start_time, stop_time
    '<ok />'
  }

  model 'create-subscription', ['stream'],    'leaf', 'type' => 'string'
  model 'create-subscription', ['filter'],    'leaf', 'type' => 'anyxml'
  model 'create-subscription', ['startTime'], 'leaf', 'type' => 'string'
  model 'create-subscription', ['stopTime'],  'leaf', 'type' => 'string'
end