blob: ed080cb13b91d70a086472bf037cc5d363671d27 [file] [log] [blame]
# rtevalXMLRPC.py - main rteval XML-RPC class
#
# Copyright 2009 - 2013 Clark Williams <williams@redhat.com>
# Copyright 2009 - 2013 David Sommerseth <davids@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# For the avoidance of doubt the "preferred form" of this code is one which
# is in an open unpatent encumbered format. Where cryptographic key signing
# forms part of the process of creating an executable the information
# including keys needed to generate an equivalently functional executable
# are deemed to be part of the source code.
#
import socket, time
import rtevalclient, xmlrpclib
from Log import Log
class rtevalXMLRPC(object):
def __init__(self, host, logger, mailer = None):
self.__host = host
self.__url= "http://%s/rteval/API1/" % self.__host
self.__logger = logger
self.__mailer = mailer
self.__client = rtevalclient.rtevalclient(self.__url)
def Ping(self):
res = None
self.__logger.log(Log.DEBUG, "Checking if XML-RPC server '%s' is reachable" % self.__host)
attempt = 0
ping_success = False
warning_sent = False
while attempt < 6:
try:
res = self.__client.Hello()
attempt = 10
ping_success = True
except xmlrpclib.ProtocolError:
# Server do not support Hello(), but is reachable
self.__logger.log(Log.INFO, "Got XML-RPC connection with %s but it did not support Hello()"
% self.__host)
res = None
except socket.error, err:
self.__logger.log(Log.INFO, "Could not establish XML-RPC contact with %s\n%s"
% (self.__host, str(err)))
# Do attempts handling
attempt += 1
if attempt > 5:
break # To avoid sleeping before we abort
if (self.__mailer is not None) and (not warning_sent):
self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to ping XML-RPC server",
"Server %s did not respond." % self.__host)
warning_sent = True
print "Failed pinging XML-RPC server. Doing another attempt(%i) " % attempt
time.sleep(attempt) #*15) # Incremental sleep - sleep attempts*15 seconds
ping_success = False
if res:
self.__logger.log(Log.INFO, "Verified XML-RPC connection with %s (XML-RPC API version: %i)"
% (res["server"], res["APIversion"]))
self.__logger.log(Log.DEBUG, "Recieved greeting: %s" % res["greeting"])
return ping_success
def SendReport(self, xmlreport):
"Sends the report to a given XML-RPC host. Returns 0 on success or 2 on submission failure."
attempt = 0
exitcode = 2 # Presume failure
warning_sent = False
while attempt < 6:
try:
print "Submitting report to %s" % self.__url
rterid = self.__client.SendReport(xmlreport)
print "Report registered with submission id %i" % rterid
attempt = 10
exitcode = 0 # Success
except socket.error:
attempt += 1
if attempt > 5:
break # To avoid sleeping before we abort
if (self.__mailer is not None) and (not warning_sent):
self.__mailer.SendMessage("[RTEVAL:WARNING] Failed to submit report to XML-RPC server",
"Server %s did not respond. Not giving up yet."
% self.__host)
warning_sent = True
print "Failed sending report. Doing another attempt(%i) " % attempt
time.sleep(attempt) #*5*60) # Incremental sleep - sleep attempts*5 minutes
except Exception, err:
raise err
if (self.__mailer is not None):
# Send final result messages
if exitcode == 2:
self.__mailer.SendMessage("[RTEVAL:FAILURE] Failed to submit report to XML-RPC server",
"Server %s did not respond at all after %i attempts."
% (self.__host, attempt - 1))
elif (exitcode == 0) and warning_sent:
self.__mailer.SendMessage("[RTEVAL:SUCCESS] XML-RPC server available again",
"Succeeded to submit the report to %s"
% self.__host)
return exitcode