# -*- coding: utf-8 -*-
import logging
from time import sleep
import requests
import json
from requests.exceptions import ConnectionError
from zenossapi.apiclient import ZenossAPIClientError, ZenossAPIClientAuthenticationError
[docs]
class ZenossRouter(object):
"""
Base class for Zenoss router classes
"""
def __init__(self, url, headers, ssl_verify, endpoint, action, timeout=5, maxattempts=3):
self.api_url = url
self.api_headers = headers
self.ssl_verify = ssl_verify
self.api_endpoint = endpoint
self.api_action = action
self.api_timeout = timeout
self.api_maxattempts = maxattempts
def _check_uid(self, uid):
if not uid.startswith('Devices'):
if uid.startswith('/'):
uid = 'Devices{0}'.format(uid)
else:
uid = 'Devices/{0}'.format(uid)
return uid
def _make_request_data(self, method, data=None):
if data is None:
return dict(
action=self.api_action,
method=method,
tid=1,
)
else:
return dict(
action=self.api_action,
method=method,
data=[data],
tid=1,
)
def _router_request(self, data, response_timeout=None):
# Disable warnings from urllib3 if ssl_verify is False, otherwise
# every request will print an InsecureRequestWarning
if not self.ssl_verify:
requests.urllib3.disable_warnings()
if response_timeout is None:
response_timeout = self.api_timeout
tries = 0
while tries < self.api_maxattempts:
try:
response = requests.request("POST",
'{0}/{1}'.format(self.api_url, self.api_endpoint),
headers=self.api_headers,
data=json.dumps(data).encode('utf-8'),
verify=self.ssl_verify,
timeout=response_timeout
)
break
except ConnectionError as e:
logging.warning('Error calling Zenoss API attempt %i/%i\n Error: %s\n Request data: %s' % (tries, self.api_maxattempts, e, data))
# Atempt to display the failure reason from Zenoss
try:
logging.warning("Query failure reason from Zensos: %s" % response['result']['msg'])
except:
pass
if tries == self.api_maxattempts:
raise ZenossAPIClientError('Unable to connect to Zenoss server {0}: {1}'.format(self.api_url, e))
tries += 1
if response.ok:
if response.url.find('login_form') > -1:
raise ZenossAPIClientAuthenticationError('API Login Failed')
response_json = response.json()
if 'result' in response_json:
if response_json['result']:
if 'success' in response_json['result']:
if not response_json['result']['success']:
raise ZenossAPIClientError('Request failed: {}'.format(response_json['result']['msg']))
else:
raise ZenossAPIClientError('Request failed, no response data returned!')
return response_json['result']
else:
raise ZenossAPIClientError('Request failed: {0} {1}'.format(response.status_code, response.reason))