diff --git a/brian_polling_manager/configuration.py b/brian_polling_manager/configuration.py
index ec177a678265d24a70d72026a970ef5c83ce6994..38de9c9da94743a7be69f56ed0089cb0b0050363 100644
--- a/brian_polling_manager/configuration.py
+++ b/brian_polling_manager/configuration.py
@@ -32,6 +32,11 @@ _DEFAULT_CONFIG = {
'command': ('{script} {measurement} '
'{community} {hostname} '
'{interface} {ifIndex}'),
+ },
+ 'gws-direct-interface-check': {
+ 'script': '/var/lib/sensu/bin/poll-gws-direct.sh',
+ 'measurement': 'gwsd_counters',
+ 'command': '{script} {measurement} {nren} {isp} {hostname} {tag}'
}
},
'statedir': '/tmp/',
@@ -65,9 +70,13 @@ CONFIG_SCHEMA = {
'minItems': 1
},
'api-key': {'type': 'string'},
- 'interface-check': {'$ref': '#/definitions/influx-check'}
+ 'interface-check': {'$ref': '#/definitions/influx-check'},
+ 'gws-direct-interface-check':
+ {'$ref': '#/definitions/influx-check'}
},
- 'required': ['api-base', 'api-key', 'interface-check'],
+ 'required': [
+ 'api-base', 'api-key',
+ 'interface-check', 'gws-direct-interface-check'],
'additionalProperties': False
},
'statsd': {
@@ -116,9 +125,10 @@ class State(object):
def __init__(self, state_dir: str):
assert os.path.isdir(state_dir)
- self.filenames = {
+ self.cache_filenames = {
'state': os.path.join(state_dir, State.STATE),
- 'cache': os.path.join(state_dir, State.INTERFACES)
+ 'interfaces': os.path.join(state_dir, State.INTERFACES),
+ 'gws-direct': os.path.join(state_dir, State.GWS_DIRECT)
}
@staticmethod
@@ -133,38 +143,58 @@ class State(object):
f'unable to open state file {filename}')
return None
+ @staticmethod
+ def _save_json(filename, new_data, schema):
+ try:
+ jsonschema.validate(new_data, schema)
+ except jsonschema.ValidationError:
+ logger.exception('invalid interface state data')
+ return
+
+ with open(filename, 'w') as f:
+ f.write(json.dumps(new_data))
+
@property
def last(self) -> int:
- state = State._load_json(self.filenames['state'], State.STATE_SCHEMA)
+ state = State._load_json(
+ self.cache_filenames['state'], State.STATE_SCHEMA)
return state['last'] if state else -1
@last.setter
def last(self, new_last: Union[float, None]):
if not new_last or new_last < 0:
- os.unlink(self.filenames['state'])
+ os.unlink(self.cache_filenames['state'])
else:
- state = {'last': new_last}
- with open(self.filenames['state'], 'w') as f:
- f.write(json.dumps(state))
+ State._save_json(
+ self.cache_filenames['state'],
+ {'last': new_last},
+ State.STATE_SCHEMA)
@property
def interfaces(self) -> list:
return State._load_json(
- self.filenames['cache'],
+ self.cache_filenames['interfaces'],
inventory.INVENTORY_INTERFACES_SCHEMA)
@interfaces.setter
def interfaces(self, new_interfaces):
- try:
- jsonschema.validate(
- new_interfaces,
- inventory.INVENTORY_INTERFACES_SCHEMA)
- except jsonschema.ValidationError:
- logger.exception('invalid interface state data')
- return
+ State._save_json(
+ self.cache_filenames['interfaces'],
+ new_interfaces,
+ inventory.INVENTORY_INTERFACES_SCHEMA)
- with open(self.filenames['cache'], 'w') as f:
- f.write(json.dumps(new_interfaces))
+ @property
+ def gws_direct(self) -> list:
+ return State._load_json(
+ self.cache_filenames['gws-direct'],
+ inventory.GWS_DIRECT_SCHEMA)
+
+ @gws_direct.setter
+ def gws_direct(self, new_interfaces):
+ State._save_json(
+ self.cache_filenames['gws-direct'],
+ new_interfaces,
+ inventory.GWS_DIRECT_SCHEMA)
def _setup_logging(filename=None):
diff --git a/brian_polling_manager/inventory.py b/brian_polling_manager/inventory.py
index ac950c461f3ecdb11f40912c0fd0ae5e4620596e..1b6ceae885b7802bfb7229aa5b778e32fbd9d3bb 100644
--- a/brian_polling_manager/inventory.py
+++ b/brian_polling_manager/inventory.py
@@ -181,20 +181,8 @@ def load_gws_direct_interfaces(base_urls):
:param base_urls: inventory provider base api url, or a list of them
:return: an interable of interface-specific check data
"""
-
- gws_direct_config = _load_inventory_json(
- 'poller/gws/direct', base_urls, INVENTORY_INTERFACES_SCHEMA)
-
- def _ifc_check_params(config_item):
- # i.e. all but the counters element
- return {
- 'nren': config_item['nren'],
- 'isp': config_item['isp'],
- 'hostname': config_item['hostname'],
- 'tag': config_item['tag']
- }
-
- return map(_ifc_check_params, gws_direct_config)
+ return _load_inventory_json(
+ 'poller/gws/direct', base_urls, GWS_DIRECT_SCHEMA)
def last_update_timestamp(base_urls) -> float:
diff --git a/brian_polling_manager/main.py b/brian_polling_manager/main.py
index b11406b90d8ff2372fc5ea00d13cdea71e123d3f..4fc22b306f19739192a94ff2b1303d76bf873a71 100644
--- a/brian_polling_manager/main.py
+++ b/brian_polling_manager/main.py
@@ -52,7 +52,8 @@ REFRESH_RESULT_SCHEMA = {
},
'type': 'object',
'properties': {
- 'interfaces': {'$ref': '#/definitions/refresh-result'}
+ 'interfaces': {'$ref': '#/definitions/refresh-result'},
+ 'gws_direct': {'$ref': '#/definitions/refresh-result'}
},
'required': ['interfaces'],
'additionalProperties': False
@@ -77,26 +78,27 @@ def refresh(config, force=False):
if force or not last or last != state.last:
state.last = last
state.interfaces = inventory.load_interfaces(config['inventory'])
- # state.gws_direct = inventory.load_gws_direct_interfaces(
- # config['inventory'])
+ state.gws_direct = inventory.load_gws_direct_interfaces(
+ config['inventory'])
result = {
'interfaces': interfaces.refresh(config['sensu'], state.interfaces),
- # 'gws direct': gws_direct.refresh(config['sensu'], state)
+ 'gws_direct': gws_direct.refresh(config['sensu'], state.gws_direct)
}
+ jsonschema.validate(result, REFRESH_RESULT_SCHEMA) # sanity
statsd_config = config.get('statsd', None)
if statsd_config:
- statsd = StatsClient(
- host=statsd_config['hostname'],
- port=statsd_config['port'],
- prefix=f'{statsd_config["prefix"]}_interfaces')
- statsd.gauge('checks', result['interfaces']['checks'])
- statsd.gauge('input', result['interfaces']['input'])
- statsd.gauge('created', result['interfaces']['created'])
- statsd.gauge('updated', result['interfaces']['updated'])
- statsd.gauge('deleted', result['interfaces']['deleted'])
+ for key, counts in result.items():
+ statsd = StatsClient(
+ host=statsd_config['hostname'],
+ port=statsd_config['port'],
+ prefix=f'{statsd_config["prefix"]}_{key}')
+ statsd.gauge('checks', counts['checks'])
+ statsd.gauge('input', counts['input'])
+ statsd.gauge('created', counts['created'])
+ statsd.gauge('updated', counts['updated'])
+ statsd.gauge('deleted', counts['deleted'])
- jsonschema.validate(result, REFRESH_RESULT_SCHEMA) # sanity
return result
diff --git a/test/conftest.py b/test/conftest.py
index 4b6295e2e525d036daae16c59df24f63581a8ee1..da76a08afe7ed2c9685d3427cf5f2203a122d5e2 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -39,6 +39,11 @@ def config():
'command': ('{script} {measurement} '
'{community} {hostname} '
'{interface} {ifIndex}'),
+ },
+ 'gws-direct-interface-check': {
+ 'script': '/var/lib/sensu/bin/poll-gws-direct.sh',
+ 'measurement': 'gwsd_counters',
+ 'command': '{script} {measurement} {nren} {isp} {hostname} {tag}'
}
},
'statedir': state_dir_name,
@@ -164,6 +169,12 @@ def mocked_inventory():
url=re.compile(r'.*inventory.+/poller/interfaces.*'),
body=_load_test_data('interfaces.json'))
+ # mocked api for returning all checks
+ responses.add(
+ method=responses.GET,
+ url=re.compile(r'.*inventory.+/poller/gws/direct'),
+ body=_load_test_data('gws-direct.json'))
+
bogus_version = {'latch': {'timestamp': 10000 * random.random()}}
# mocked api for returning all checks
responses.add(
diff --git a/test/data/gws-direct.json b/test/data/gws-direct.json
new file mode 100644
index 0000000000000000000000000000000000000000..445a34058ddfa9818bda2f3ff51a80a919e87117
--- /dev/null
+++ b/test/data/gws-direct.json
@@ -0,0 +1 @@
+[{"nren": "ARNES", "isp": "Cogent", "hostname": "88.200.0.63", "tag": "a", "counters": [{"field": "discards_in", "oid": "1.3.6.1.2.1.2.2.1.13.533", "community": "gn2nocT3st"}, {"field": "discards_out", "oid": "1.3.6.1.2.1.2.2.1.19.533", "community": "gn2nocT3st"}, {"field": "errors_in", "oid": "1.3.6.1.2.1.2.2.1.14.533", "community": "gn2nocT3st"}, {"field": "errors_out", "oid": "1.3.6.1.2.1.2.2.1.20.533", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Cogent", "hostname": "88.200.0.63", "tag": "b", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.531", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.531", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Cogent", "hostname": "88.200.0.63", "tag": "c", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.525", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.525", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Cogent", "hostname": "88.200.0.63", "tag": "d", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.553", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.553", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Cogent", "hostname": "88.200.0.63", "tag": "e", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.563", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.563", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Telia", "hostname": "62.40.124.6", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.611", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.611", "community": "gn2nocT3st"}]}, {"nren": "ARNES", "isp": "Telia", "hostname": "62.40.124.6", "tag": "b", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.589", "community": "gn2nocT3st"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.589", "community": "gn2nocT3st"}]}, {"nren": "CARNET", "isp": "Cogent", "hostname": "62.40.124.10", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.35", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.35", "community": "atlas1453"}]}, {"nren": "CARNET", "isp": "Telia", "hostname": "62.40.125.150", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.48", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.48", "community": "atlas1453"}]}, {"nren": "KIFU", "isp": "Cogent", "hostname": "195.111.97.108", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.155", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.155", "community": "atlas1453"}]}, {"nren": "KIFU", "isp": "Telia", "hostname": "195.111.97.108", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.148", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.148", "community": "atlas1453"}]}, {"nren": "RedIRIS", "isp": "Telia", "hostname": "130.206.206.250", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.1487", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.1487", "community": "atlas1453"}]}, {"nren": "RedIRIS", "isp": "Telia", "hostname": "130.206.206.250", "tag": "b", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.1488", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.1488", "community": "atlas1453"}]}, {"nren": "RedIRIS", "isp": "Telia", "hostname": "130.206.206.250", "tag": "c", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.1489", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.1489", "community": "atlas1453"}]}, {"nren": "RedIRIS", "isp": "Telia", "hostname": "130.206.206.250", "tag": "d", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.760", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.760", "community": "atlas1453"}]}, {"nren": "RedIRIS", "isp": "Telia", "hostname": "130.206.206.250", "tag": "e", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.796", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.796", "community": "atlas1453"}]}, {"nren": "RoEduNet", "isp": "Cogent", "hostname": "149.6.50.10", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.531", "community": "dante"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.531", "community": "dante"}]}, {"nren": "RoEduNet", "isp": "Century Link", "hostname": "212.162.45.194", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.9", "community": "dante"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.9", "community": "dante"}]}, {"nren": "EENet", "isp": "Telia", "hostname": "193.40.133.2", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.263", "community": "geant-mon-telia"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.263", "community": "geant-mon-telia"}]}, {"nren": "PSNC", "isp": "Century Link", "hostname": "212.191.126.6", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.675", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.675", "community": "atlas1453"}]}, {"nren": "PSNC", "isp": "Century Link", "hostname": "212.191.126.7", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.677", "community": "atlas1453"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.677", "community": "atlas1453"}]}, {"nren": "FCCN", "isp": "Cogent", "hostname": "193.136.5.43", "tag": "a", "counters": [{"field": "traffic_in", "oid": "1.3.6.1.2.1.31.1.1.1.6.47", "community": "geantcom"}, {"field": "traffic_out", "oid": "1.3.6.1.2.1.31.1.1.1.10.47", "community": "geantcom"}]}]
\ No newline at end of file