Skip to content

Commit

Permalink
Implement declare alarms
Browse files Browse the repository at this point in the history
  • Loading branch information
dpino committed Aug 28, 2017
1 parent e8f806f commit 27c6bef
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 10 deletions.
17 changes: 12 additions & 5 deletions src/apps/ipv4/arp.lua
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ local lib = require("core.lib")
local datagram = require("lib.protocol.datagram")
local ethernet = require("lib.protocol.ethernet")
local ipv4 = require("lib.protocol.ipv4")
local alarm_codec = require("apps.config.alarm_codec")
local alarms = require("lib.yang.alarms")

alarms.add_to_inventory {
Expand All @@ -29,6 +28,16 @@ alarms.add_to_inventory {
description='Raise up if ARP app cannot resolve IP address'
}
}
local resolve_alarm = alarms.declare_alarm {
[{resource='external-interface', alarm_type_id='arp-resolution', alarm_type_qualifier=''}] = {
perceived_severity = 'critical',
alarm_text =
'Make sure you can resolve external-interface.next-hop.ip address '..
'manually. If it cannot be resolved, consider setting the MAC '..
'address of the next-hop directly. To do it so, set '..
'external-interface.next-hop.mac to the value of the MAC address.',
},
}

local C = ffi.C
local receive, transmit = link.receive, link.transmit
Expand Down Expand Up @@ -158,8 +167,7 @@ end
function ARP:arp_resolving (ip)
print(("ARP: Resolving '%s'"):format(ipv4:ntop(self.next_ip)))
if self.alarm_notification then
local key = {resource='external-interface', alarm_type_id='arp-resolution'}
alarm_codec.raise_alarm(key)
resolve_alarm:raise()
end
end

Expand All @@ -180,8 +188,7 @@ end
function ARP:arp_resolved (ip, mac)
print(("ARP: '%s' resolved (%s)"):format(ipv4:ntop(ip), ethernet:ntop(mac)))
if self.alarm_notification then
local key = {resource='external-interface', alarm_type_id='arp-resolution'}
alarm_codec.clear_alarm(key)
resolve_alarm:clear()
end
end

Expand Down
63 changes: 58 additions & 5 deletions src/lib/yang/alarms.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module(..., package.seeall)

local data = require('lib.yang.data')
local util = require('lib.yang.util')
local alarm_codec = require('apps.config.alarm_codec')

local state = {
alarm_inventory = {
Expand Down Expand Up @@ -43,6 +44,63 @@ function add_to_inventory (alarm_types)
end
end

-- Single point to access alarm keys.
alarm_keys = {}

function alarm_keys:fetch (...)
self.cache = self.cache or {}
local function lookup (resource, alarm_type_id, alarm_type_qualifier)
if not self.cache[resource] then
self.cache[resource] = {}
end
if not self.cache[resource][alarm_type_id] then
self.cache[resource][alarm_type_id] = {}
end
return self.cache[resource][alarm_type_id][alarm_type_qualifier]
end
local resource, alarm_type_id, alarm_type_qualifier = unpack({...})
assert(resource and alarm_type_id)
alarm_type_qualifier = alarm_type_qualifier or ''
local key = lookup(resource, alarm_type_id, alarm_type_qualifier)
if not key then
key = {resource=resource, alarm_type_id=alarm_type_id,
alarm_type_qualifier=alarm_type_qualifier}
self.cache[resource][alarm_type_id][alarm_type_qualifier] = key
end
return key
end
function alarm_keys:normalize (key)
local resource = assert(key.resource)
local alarm_type_id = assert(key.alarm_type_id)
local alarm_type_qualifier = key.alarm_type_qualifier or ''
return self:fetch(resource, alarm_type_id, alarm_type_qualifier)
end

local function table_size (t)
local size = 0
for _ in pairs(t) do size = size + 1 end
return size
end

-- Contains a table with all the declared alarms.
local alarm_list = {}

function declare_alarm (alarm)
assert(table_size(alarm) == 1)
local key
for k, v in pairs(alarm) do
key = alarm_keys:normalize(k)
alarm_list[key] = v
end
function alarm:raise (args)
alarm_codec.raise_alarm(key, args)
end
function alarm:clear ()
alarm_codec.clear_alarm(key)
end
return alarm
end

---

function raise_alarm (key, args)
Expand All @@ -60,11 +118,6 @@ end

function selftest ()
print("selftest: alarms")
local function table_size (t)
local size = 0
for _ in pairs(t) do size = size + 1 end
return size
end

require("apps.ipv4.arp")
assert(table_size(state.alarm_inventory.alarm_type) > 0)
Expand Down

0 comments on commit 27c6bef

Please sign in to comment.