Commit 31804f68 authored by Bryton Lacquement's avatar Bryton Lacquement 🚪 Committed by Julien Muchembled

erp5.util: add support for Python 3

/reviewed-on !830
parent 5abb074d
This diff is collapsed.
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
# #
############################################################################## ##############################################################################
from __future__ import print_function
import argparse import argparse
import os import os
import sys import sys
...@@ -264,7 +265,7 @@ class PerformanceTester(object): ...@@ -264,7 +265,7 @@ class PerformanceTester(object):
error_message = exit_msg_queue.get() error_message = exit_msg_queue.get()
except KeyboardInterrupt, e: except KeyboardInterrupt, e:
print >>sys.stderr, "\nInterrupted by user, stopping gracefully..." print("\nInterrupted by user, stopping gracefully...", file=sys.stderr)
exit_status = 2 exit_status = 2
# An IOError may be raised when receiving a SIGINT which interrupts the # An IOError may be raised when receiving a SIGINT which interrupts the
...@@ -337,7 +338,7 @@ class PerformanceTester(object): ...@@ -337,7 +338,7 @@ class PerformanceTester(object):
def main(): def main():
error_message_set, exit_status = PerformanceTester().run() error_message_set, exit_status = PerformanceTester().run()
for error_message in error_message_set: for error_message in error_message_set:
print >>sys.stderr, "ERROR: %s" % error_message print("ERROR: %s" % error_message, file=sys.stderr)
sys.exit(exit_status) sys.exit(exit_status)
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
# #
############################################################################## ##############################################################################
from __future__ import print_function
import argparse import argparse
import re import re
...@@ -537,7 +538,7 @@ def generateReport(): ...@@ -537,7 +538,7 @@ def generateReport():
for filename in filename_iter: for filename in filename_iter:
# There may be no results at all in case of errors # There may be no results at all in case of errors
if not os.stat(filename).st_size: if not os.stat(filename).st_size:
print >>sys.stderr, "Ignoring empty file %s" % filename print("Ignoring empty file %s" % filename, file=sys.stderr)
continue continue
report_dict = per_nb_users_report_dict.setdefault( report_dict = per_nb_users_report_dict.setdefault(
...@@ -546,10 +547,8 @@ def generateReport(): ...@@ -546,10 +547,8 @@ def generateReport():
report_dict['filename'].append(filename) report_dict['filename'].append(filename)
if not per_nb_users_report_dict: if not per_nb_users_report_dict:
print >>sys.stderr, "ERROR: No result file found, perhaps "\ sys.exit("ERROR: No result file found, perhaps ``--filename-prefix'' should"
"``--filename-prefix'' should be specified?" "be specified?")
sys.exit(1)
pdf = PdfPages(argument_namespace.output_filename) pdf = PdfPages(argument_namespace.output_filename)
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
# #
############################################################################## ##############################################################################
from __future__ import print_function
from .result import CSVBenchmarkResult, NothingFlushedException from .result import CSVBenchmarkResult, NothingFlushedException
class CSVScalabilityBenchmarkResult(CSVBenchmarkResult): class CSVScalabilityBenchmarkResult(CSVBenchmarkResult):
...@@ -60,7 +61,7 @@ class ScalabilityTester(PerformanceTester): ...@@ -60,7 +61,7 @@ class ScalabilityTester(PerformanceTester):
urllib.urlencode({'error_message_set': '|'.join(error_message_set)})).close() urllib.urlencode({'error_message_set': '|'.join(error_message_set)})).close()
except: except:
print >>sys.stderr, "ERROR: %s" % Formatter().formatException(sys.exc_info()) print("ERROR: %s" % Formatter().formatException(sys.exc_info()), file=sys.stderr)
def getResultClass(self): def getResultClass(self):
if not self._argument_namespace.erp5_publish_url: if not self._argument_namespace.erp5_publish_url:
......
...@@ -27,7 +27,7 @@ def main(): ...@@ -27,7 +27,7 @@ def main():
if error_message_set: if error_message_set:
exit_status = 1 exit_status = 1
for error in error_message_set: for error in error_message_set:
print error print(error)
elif result: elif result:
print result print(result)
sys.exit(exit_status) sys.exit(exit_status)
...@@ -5,23 +5,15 @@ import os ...@@ -5,23 +5,15 @@ import os
import shutil import shutil
import time import time
import sys import sys
import multiprocessing
import signal
import errno
import json import json
import logging import logging
import logging.handlers import logging.handlers
import glob import glob
import urlparse
import httplib
import base64
import threading import threading
from erp5.util.benchmark.argument import ArgumentType
from erp5.util.benchmark.performance_tester import PerformanceTester
from erp5.util.benchmark.thread import TestThread, TestMetricThread from erp5.util.benchmark.thread import TestThread, TestMetricThread
from erp5.util import taskdistribution from erp5.util import taskdistribution
from erp5.util.testnode import Utils from erp5.util.testnode import Utils
from erp5.util.testnode.ProcessManager import SubprocessError, ProcessManager, CancellationError from erp5.util.testnode.ProcessManager import ProcessManager
import datetime import datetime
MAX_INSTALLATION_TIME = 60*50 MAX_INSTALLATION_TIME = 60*50
...@@ -179,31 +171,28 @@ class ScalabilityLauncher(object): ...@@ -179,31 +171,28 @@ class ScalabilityLauncher(object):
""" """
data_array = self.__argumentNamespace.current_test_data.split(',') data_array = self.__argumentNamespace.current_test_data.split(',')
data = json.dumps({"count": data_array[0], "title": data_array[1], "relative_path": data_array[2]}) data = json.dumps({"count": data_array[0], "title": data_array[1], "relative_path": data_array[2]})
decoded_data = Utils.deunicodeData(json.loads(data)) encoded_data = Utils.deunicodeData(json.loads(data))
return ScalabilityTest(decoded_data, self.test_result) return ScalabilityTest(encoded_data, self.test_result)
def clearUsersFile(self, user_file_path): def clearUsersFile(self, user_file_path):
self.log("Clearing users file: %s" % user_file_path) self.log("Clearing users file: %s" % user_file_path)
os.remove(user_file_path) os.remove(user_file_path)
users_file = open(user_file_path, "w") with open(user_file_path, "w") as users_file:
for line in self.users_file_original_content: for line in self.users_file_original_content:
users_file.write(line) users_file.write(line)
users_file.close()
def updateUsersFile(self, user_quantity, password, user_file_path): def updateUsersFile(self, user_quantity, password, user_file_path):
self.log("Updating users file: %s" % user_file_path) self.log("Updating users file: %s" % user_file_path)
users_file = open(user_file_path, "r") with open(user_file_path, "r") as users_file:
file_content = users_file.readlines() file_content = users_file.readlines()
self.users_file_original_content = file_content self.users_file_original_content = file_content
new_file_content = [] new_file_content = []
for line in file_content: for line in file_content:
new_file_content.append(line.replace('<password>', password).replace('<user_quantity>', str(user_quantity))) new_file_content.append(line.replace('<password>', password).replace('<user_quantity>', str(user_quantity)))
users_file.close()
os.remove(user_file_path) os.remove(user_file_path)
users_file = open(user_file_path, "w") with open(user_file_path, "w") as users_file:
for line in new_file_content: for line in new_file_content:
users_file.write(line) users_file.write(line)
users_file.close()
def run(self): def run(self):
self.log("Scalability Launcher started, with:") self.log("Scalability Launcher started, with:")
......
...@@ -40,11 +40,15 @@ Example use: ...@@ -40,11 +40,15 @@ Example use:
test_line.stop() test_line.stop()
""" """
from __future__ import print_function from __future__ import print_function
import httplib import six
from six.moves import (
map,
http_client as httplib,
xmlrpc_client as xmlrpclib,
)
import socket import socket
import threading import threading
import time import time
import xmlrpclib
__all__ = ['TaskDistributor', 'TestResultProxy', 'TestResultLineProxy', 'patchRPCParser'] __all__ = ['TaskDistributor', 'TestResultProxy', 'TestResultLineProxy', 'patchRPCParser']
...@@ -89,11 +93,17 @@ def patchRPCParser(error_handler): ...@@ -89,11 +93,17 @@ def patchRPCParser(error_handler):
def verbose_feed(self, data): def verbose_feed(self, data):
try: try:
return original_feed(self, data) return original_feed(self, data)
except Exception, exc: except Exception as exc:
if not error_handler(data, exc): if not error_handler(data, exc):
raise raise
parser_klass.feed = verbose_feed parser_klass.feed = verbose_feed
try: # PY3
basestring
except NameError:
basestring = bytes, str
unicode = str
def binarize_args(arg): def binarize_args(arg):
# Converts recursively basestring arg into xmlrpclib.Binary, as they can # Converts recursively basestring arg into xmlrpclib.Binary, as they can
# contain non-XML allowed characters # contain non-XML allowed characters
...@@ -102,9 +112,9 @@ def binarize_args(arg): ...@@ -102,9 +112,9 @@ def binarize_args(arg):
arg = arg.encode('utf-8') arg = arg.encode('utf-8')
return xmlrpclib.Binary(arg) return xmlrpclib.Binary(arg)
if isinstance(arg, (list, tuple, set)): if isinstance(arg, (list, tuple, set)):
return map(binarize_args, arg) return list(map(binarize_args, arg))
if isinstance(arg, dict): if isinstance(arg, dict):
return {k: binarize_args(v) for k, v in arg.iteritems()} return {k: binarize_args(v) for k, v in six.iteritems(arg)}
return arg return arg
class RPCRetry(object): class RPCRetry(object):
...@@ -350,7 +360,7 @@ class TestResultProxy(RPCRetry): ...@@ -350,7 +360,7 @@ class TestResultProxy(RPCRetry):
caption_list = [] caption_list = []
append = caption_list.append append = caption_list.append
for name, (stream, max_history_bytes) in \ for name, (stream, max_history_bytes) in \
self._watcher_dict.iteritems(): six.iteritems(self._watcher_dict):
append('==> %s <==' % (name, )) append('==> %s <==' % (name, ))
start = stream.tell() start = stream.tell()
stream.seek(0, 2) stream.seek(0, 2)
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
# #
# TODO: There must be a better way than the code below to do that though... # TODO: There must be a better way than the code below to do that though...
from __future__ import print_function
import sys import sys
from erp5.util.testbrowser.browser import Browser from erp5.util.testbrowser.browser import Browser
...@@ -19,11 +20,8 @@ try: ...@@ -19,11 +20,8 @@ try:
user_nbr = int(user_nbr) user_nbr = int(user_nbr)
except ValueError: except ValueError:
print >>sys.stderr, "ERROR: Missing arguments: %s URL USERNAME " \ sys.exit("ERROR: Missing arguments: %s URL USERNAME PASSWORD NUMBER_OF_USERS "
"PASSWORD NUMBER_OF_USERS NEW_USERNAME_PREFIX NEW_USERS_PASSWORD" % \ "NEW_USERNAME_PREFIX NEW_USERS_PASSWORD" % sys.argv[0])
sys.argv[0]
sys.exit(1)
# Create a browser instance # Create a browser instance
browser = Browser(url, username, password) browser = Browser(url, username, password)
......
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import division, print_function
from erp5.util.testbrowser.browser import Browser from erp5.util.testbrowser.browser import Browser
ITERATION = 20 ITERATION = 20
...@@ -89,4 +90,4 @@ if __name__ == '__main__': ...@@ -89,4 +90,4 @@ if __name__ == '__main__':
counter += 1 counter += 1
for title, time_list in result_dict.iteritems(): for title, time_list in result_dict.iteritems():
print "%s: %.4fs" % (title, float(sum(time_list)) / ITERATION) print("%s: %.4fs" % (title, sum(time_list) / ITERATION))
...@@ -32,6 +32,8 @@ import string ...@@ -32,6 +32,8 @@ import string
import random import random
from .Utils import createFolder from .Utils import createFolder
from six.moves import range
class SlapOSInstance(object): class SlapOSInstance(object):
""" """
Base of an software instance, Base of an software instance,
...@@ -69,14 +71,14 @@ class NodeTestSuite(SlapOSInstance): ...@@ -69,14 +71,14 @@ class NodeTestSuite(SlapOSInstance):
def createSuiteLog(self): def createSuiteLog(self):
# /srv/slapgrid/slappartXX/srv/var/log/testnode/az-D27KqX7FxJ/suite.log # /srv/slapgrid/slappartXX/srv/var/log/testnode/az-D27KqX7FxJ/suite.log
alphabets = string.digits + string.letters alphabets = string.digits + string.ascii_letters
while 1: while 1:
log_folder_name = '%s-%s' % (self.reference, log_folder_name = '%s-%s' % (self.reference,
''.join(random.choice(alphabets) for i in xrange(10))) ''.join(random.choice(alphabets) for i in range(10)))
log_folder_path = os.path.join(self.log_directory, log_folder_name) log_folder_path = os.path.join(self.log_directory, log_folder_name)
try: try:
os.makedirs(log_folder_path) os.makedirs(log_folder_path)
except OSError, e: except OSError as e:
if e.errno != errno.EEXIST: if e.errno != errno.EEXIST:
raise raise
else: else:
......
...@@ -79,7 +79,8 @@ def subprocess_capture(p, log_prefix, get_output=True): ...@@ -79,7 +79,8 @@ def subprocess_capture(p, log_prefix, get_output=True):
break break
if get_output: if get_output:
buffer.append(data) buffer.append(data)
log(log_prefix + data.rstrip('\n')) log(log_prefix + (data if str is bytes else
data.decode('utf-8', errors='replace')).rstrip('\n'))
if p.stdout: if p.stdout:
stdout = [] stdout = []
stdout_thread = threading.Thread(target=readerthread, stdout_thread = threading.Thread(target=readerthread,
...@@ -97,8 +98,8 @@ def subprocess_capture(p, log_prefix, get_output=True): ...@@ -97,8 +98,8 @@ def subprocess_capture(p, log_prefix, get_output=True):
stdout_thread.join() stdout_thread.join()
if p.stderr: if p.stderr:
stderr_thread.join() stderr_thread.join()
return (p.stdout and ''.join(stdout), return (p.stdout and b''.join(stdout),
p.stderr and ''.join(stderr)) p.stderr and b''.join(stderr))
def killCommand(pid): def killCommand(pid):
""" """
...@@ -109,7 +110,7 @@ def killCommand(pid): ...@@ -109,7 +110,7 @@ def killCommand(pid):
try: try:
process = psutil.Process(pid) process = psutil.Process(pid)
process.suspend() process.suspend()
except psutil.Error, e: except psutil.Error as e:
return return
process_list = [process] process_list = [process]
new_list = process.children(recursive=True) new_list = process.children(recursive=True)
...@@ -118,19 +119,19 @@ def killCommand(pid): ...@@ -118,19 +119,19 @@ def killCommand(pid):
for child in new_list: for child in new_list:
try: try:
child.suspend() child.suspend()
except psutil.Error, e: except psutil.Error as e:
logger.debug("killCommand/suspend: %s", e) logger.debug("killCommand/suspend: %s", e)
time.sleep(1) time.sleep(1)
new_list = set(process.children(recursive=True)).difference(process_list) new_list = set(process.children(recursive=True)).difference(process_list)
for process in process_list: for process in process_list:
try: try:
process.kill() process.kill()
except psutil.Error, e: except psutil.Error as e:
logger.debug("killCommand/kill: %s", e) logger.debug("killCommand/kill: %s", e)
class ProcessManager(object): class ProcessManager(object):
stdin = file(os.devnull) stdin = open(os.devnull)
def __init__(self, max_timeout=MAX_TIMEOUT): def __init__(self, max_timeout=MAX_TIMEOUT):
self.process_pid_set = set() self.process_pid_set = set()
......
...@@ -30,30 +30,31 @@ import subprocess ...@@ -30,30 +30,31 @@ import subprocess
import sys import sys
import time import time
import glob import glob
import SlapOSControler from . import SlapOSControler, SlapOSMasterCommunicator
import SlapOSMasterCommunicator
import json import json
import time import time
import shutil import shutil
import logging import logging
import string import string
import random import random
import urlparse from six.moves.urllib.parse import urlparse
import base64 import base64
import httplib from six.moves import http_client as httplib
import Utils from . import Utils
import requests import requests
import slapos.slap import slapos.slap
import cPickle as pickle from six.moves import cPickle as pickle
from ProcessManager import SubprocessError, ProcessManager, CancellationError from .ProcessManager import SubprocessError, ProcessManager, CancellationError
from subprocess import CalledProcessError from subprocess import CalledProcessError
from Updater import Updater from .Updater import Updater
from erp5.util import taskdistribution from erp5.util import taskdistribution
from erp5.util.benchmark.thread import TestThread from erp5.util.benchmark.thread import TestThread
# for dummy slapos answer # for dummy slapos answer
import signal import signal
from . import logger from . import logger
from six.moves import range
# max time to generate frontend instance: 1.5 hour # max time to generate frontend instance: 1.5 hour
MAX_FRONTEND_TIME = 60*90 MAX_FRONTEND_TIME = 60*90
# max time to register instance to slapOSMaster: 5 minutes # max time to register instance to slapOSMaster: 5 minutes
...@@ -322,18 +323,16 @@ ces or already launched.") ...@@ -322,18 +323,16 @@ ces or already launched.")
software_hash_directory = self.testnode.config['slapos_binary'].rsplit("bin/slapos", 1)[0] software_hash_directory = self.testnode.config['slapos_binary'].rsplit("bin/slapos", 1)[0]
apache_htpasswd = software_hash_directory + "parts/apache/bin/htpasswd" apache_htpasswd = software_hash_directory + "parts/apache/bin/htpasswd"
testsuite_directory = self.testnode.config['repository_path_list'][0].rsplit('/', 1)[0] testsuite_directory = self.testnode.config['repository_path_list'][0].rsplit('/', 1)[0]
htaccess_file = open(testsuite_directory + HTACCESS, "w") with open(testsuite_directory + HTACCESS, "w") as htaccess_file:
file_content = """ htaccess_file.write("""
AuthType Basic AuthType Basic
AuthName "Password Protected Area" AuthName "Password Protected Area"
AuthUserFile "%s%s" AuthUserFile "%s%s"
Require valid-user Require valid-user
""" % (testsuite_directory, HTPASSWD) """ % (testsuite_directory, HTPASSWD))
htaccess_file.write(file_content)
htaccess_file.close()
password_path = testsuite_directory + PASSWORD_FILE password_path = testsuite_directory + PASSWORD_FILE
with open(password_path, "w") as password_file: with open(password_path, "w") as password_file:
password = ''.join(random.choice(string.digits + string.letters) for i in xrange(PASSWORD_LENGTH)) password = ''.join(random.choice(string.digits + string.ascii_letters) for i in range(PASSWORD_LENGTH))
password_file.write(password) password_file.write(password)
user = TESTNODE_USER user = TESTNODE_USER
command = [apache_htpasswd, "-bc", testsuite_directory + HTPASSWD, user, password] command = [apache_htpasswd, "-bc", testsuite_directory + HTPASSWD, user, password]
...@@ -363,7 +362,7 @@ Require valid-user ...@@ -363,7 +362,7 @@ Require valid-user
user, password = self.generateProfilePasswordAccess() user, password = self.generateProfilePasswordAccess()
logger.info("Software Profile password: %s" % password) logger.info("Software Profile password: %s" % password)
self.reachable_profile = "https://%s:%s@%s" % (user, password, self.reachable_profile = "https://%s:%s@%s" % (user, password,
os.path.join(urlparse.urlparse(self.testnode.config['frontend_url']).netloc, os.path.join(urlparse(self.testnode.config['frontend_url']).netloc,
"software", self.randomized_path, "software.cfg")) "software", self.randomized_path, "software.cfg"))
def prepareSlapOSForTestSuite(self, node_test_suite): def prepareSlapOSForTestSuite(self, node_test_suite):
...@@ -526,7 +525,7 @@ Require valid-user ...@@ -526,7 +525,7 @@ Require valid-user
if not self.launchable: if not self.launchable:
return {'status_code' : 1, 'error_message': "Current test_suite is not actually launchable." } return {'status_code' : 1, 'error_message': "Current test_suite is not actually launchable." }
configuration_list = node_test_suite.configuration_list configuration_list = node_test_suite.configuration_list
test_list = range(0, len(configuration_list)) test_list = list(range(len(configuration_list)))
try: try:
test_result_proxy = self.testnode.taskdistribution.createTestResult( test_result_proxy = self.testnode.taskdistribution.createTestResult(
node_test_suite.revision, test_list, node_test_suite.revision, test_list,
......
...@@ -35,6 +35,8 @@ from slapos import client ...@@ -35,6 +35,8 @@ from slapos import client
from . import logger from . import logger
from .Utils import createFolder from .Utils import createFolder
from six.moves import range
MAX_PARTITIONS = 10 MAX_PARTITIONS = 10
MAX_SR_RETRIES = 3 MAX_SR_RETRIES = 3
...@@ -243,7 +245,7 @@ class SlapOSControler(object): ...@@ -243,7 +245,7 @@ class SlapOSControler(object):
computer = slap.registerComputer(config['computer_id']) computer = slap.registerComputer(config['computer_id'])
# Call a method to ensure connection to master can be established # Call a method to ensure connection to master can be established
computer.getComputerPartitionList() computer.getComputerPartitionList()
except slapos.slap.ConnectionError, e: except slapos.slap.ConnectionError as e:
retries += 1 retries += 1
if retries >= 60: if retries >= 60:
raise raise
...@@ -270,7 +272,7 @@ class SlapOSControler(object): ...@@ -270,7 +272,7 @@ class SlapOSControler(object):
# MySQL DB content) from previous runs. To support changes of partition # MySQL DB content) from previous runs. To support changes of partition
# naming scheme (which already happened), do this at instance_root level. # naming scheme (which already happened), do this at instance_root level.
createFolder(instance_root, True) createFolder(instance_root, True)
for i in xrange(MAX_PARTITIONS): for i in range(MAX_PARTITIONS):
# create partition and configure computer # create partition and configure computer
# XXX: at the moment all partitions do share same virtual interface address # XXX: at the moment all partitions do share same virtual interface address
# this is not a problem as usually all services are on different ports # this is not a problem as usually all services are on different ports
...@@ -278,7 +280,7 @@ class SlapOSControler(object): ...@@ -278,7 +280,7 @@ class SlapOSControler(object):
partition_path = os.path.join(instance_root, partition_reference) partition_path = os.path.join(instance_root, partition_reference)
if not(os.path.exists(partition_path)): if not(os.path.exists(partition_path)):
os.mkdir(partition_path) os.mkdir(partition_path)
os.chmod(partition_path, 0750) os.chmod(partition_path, 0o750)
computer.updateConfiguration(xml_marshaller.xml_marshaller.dumps({ computer.updateConfiguration(xml_marshaller.xml_marshaller.dumps({
'address': config['ipv4_address'], 'address': config['ipv4_address'],
'instance_root': instance_root, 'instance_root': instance_root,
...@@ -318,7 +320,7 @@ class SlapOSControler(object): ...@@ -318,7 +320,7 @@ class SlapOSControler(object):
os.environ['PATH'] = environment['PATH'] os.environ['PATH'] = environment['PATH']
# a SR may fail for number of reasons (incl. network failures) # a SR may fail for number of reasons (incl. network failures)
# so be tolerant and run it a few times before giving up # so be tolerant and run it a few times before giving up
for _ in xrange(MAX_SR_RETRIES): for _ in range(MAX_SR_RETRIES):
status_dict = self.spawn(config['slapos_binary'], status_dict = self.spawn(config['slapos_binary'],
'node', 'software', '--all', 'node', 'software', '--all',
'--pidfile', os.path.join(self.software_root, 'slapos-node.pid'), '--pidfile', os.path.join(self.software_root, 'slapos-node.pid'),
...@@ -346,7 +348,7 @@ class SlapOSControler(object): ...@@ -346,7 +348,7 @@ class SlapOSControler(object):
# try to run for all partitions as one partition may in theory request another one # try to run for all partitions as one partition may in theory request another one
# this not always is required but curently no way to know how "tree" of partitions # this not always is required but curently no way to know how "tree" of partitions
# may "expand" # may "expand"
for _ in xrange(max_quantity): for _ in range(max_quantity):
status_dict = self.spawn(config['slapos_binary'], 'node', 'instance', status_dict = self.spawn(config['slapos_binary'], 'node', 'instance',
'--pidfile', os.path.join(self.instance_root, 'slapos-node.pid'), '--pidfile', os.path.join(self.instance_root, 'slapos-node.pid'),
'--cfg', self.slapos_config, raise_error_if_fail=False, '--cfg', self.slapos_config, raise_error_if_fail=False,
......
from __future__ import print_function
import datetime import datetime
import json import json
import traceback import traceback
...@@ -12,6 +14,8 @@ from requests.exceptions import HTTPError ...@@ -12,6 +14,8 @@ from requests.exceptions import HTTPError
from ..taskdistribution import SAFE_RPC_EXCEPTION_LIST from ..taskdistribution import SAFE_RPC_EXCEPTION_LIST
from . import logger from . import logger
import six
# max time to instance changing state: 3 hour # max time to instance changing state: 3 hour
MAX_INSTANCE_TIME = 60*60*3 MAX_INSTANCE_TIME = 60*60*3
...@@ -52,7 +56,7 @@ def retryOnNetworkFailure(func, ...@@ -52,7 +56,7 @@ def retryOnNetworkFailure(func,
except _except_list: except _except_list:
traceback.print_exc() traceback.print_exc()
print 'Network failure. Retry method %s in %i seconds' % (func, retry_time) print('Network failure. Retry method %s in %i seconds' % (func, retry_time))
time.sleep(retry_time) time.sleep(retry_time)
retry_time = min(retry_time*1.5, 640) retry_time = min(retry_time*1.5, 640)
...@@ -92,8 +96,9 @@ class SlapOSMasterCommunicator(object): ...@@ -92,8 +96,9 @@ class SlapOSMasterCommunicator(object):
if instance_title is not None: if instance_title