Revision 746540cd snf-tools/synnefo_tools/burnin.py
b/snf-tools/synnefo_tools/burnin.py | ||
---|---|---|
82 | 82 |
"%Y%m%d%H%M%S") |
83 | 83 |
SNF_TEST_PREFIX = "snf-test-" |
84 | 84 |
|
85 |
# Setup logging (FIXME - verigak) |
|
86 |
logging.basicConfig(format="%(message)s") |
|
85 |
red = '\x1b[31m' |
|
86 |
yellow = '\x1b[33m' |
|
87 |
green = '\x1b[32m' |
|
88 |
normal = '\x1b[0m' |
|
89 |
|
|
90 |
|
|
91 |
class burninFormatter(logging.Formatter): |
|
92 |
|
|
93 |
err_fmt = red + "ERROR: %(msg)s" + normal |
|
94 |
dbg_fmt = green + " * %(msg)s" + normal |
|
95 |
info_fmt = "%(msg)s" |
|
96 |
|
|
97 |
def __init__(self, fmt="%(levelno)s: %(msg)s"): |
|
98 |
logging.Formatter.__init__(self, fmt) |
|
99 |
|
|
100 |
def format(self, record): |
|
101 |
|
|
102 |
format_orig = self._fmt |
|
103 |
|
|
104 |
# Replace the original format with one customized by logging level |
|
105 |
if record.levelno == 10: # DEBUG |
|
106 |
self._fmt = burninFormatter.dbg_fmt |
|
107 |
|
|
108 |
elif record.levelno == 20: # INFO |
|
109 |
self._fmt = burninFormatter.info_fmt |
|
110 |
|
|
111 |
elif record.levelno == 40: # ERROR |
|
112 |
self._fmt = burninFormatter.err_fmt |
|
113 |
|
|
114 |
result = logging.Formatter.format(self, record) |
|
115 |
self._fmt = format_orig |
|
116 |
|
|
117 |
return result |
|
118 |
|
|
119 |
|
|
87 | 120 |
log = logging.getLogger("burnin") |
88 |
log.setLevel(logging.INFO) |
|
121 |
log.setLevel(logging.DEBUG) |
|
122 |
handler = logging.StreamHandler() |
|
123 |
handler.setFormatter(burninFormatter()) |
|
124 |
log.addHandler(handler) |
|
89 | 125 |
|
90 | 126 |
|
91 | 127 |
class UnauthorizedTestCase(unittest.TestCase): |
... | ... | |
217 | 253 |
@classmethod |
218 | 254 |
def setUpClass(cls): |
219 | 255 |
"""Initialize a kamaki instance""" |
220 |
log.info("Spawning server for image `%s'", cls.imagename) |
|
256 |
log.info("Spawning server for image `%s'", %cls.imagename)
|
|
221 | 257 |
|
222 | 258 |
cls.client = ComputeClient(API, TOKEN) |
223 | 259 |
cls.cyclades = CycladesClient(API, TOKEN) |
... | ... | |
437 | 473 |
os = image["metadata"]["values"]["os"] |
438 | 474 |
users = image["metadata"]["values"].get("users", None) |
439 | 475 |
self.client.update_server_metadata(self.serverid, OS=os) |
440 |
|
|
476 |
|
|
441 | 477 |
userlist = users.split() |
442 | 478 |
|
443 | 479 |
# Determine the username to use for future connections |
... | ... | |
1118 | 1154 |
|
1119 | 1155 |
self.assertTrue(exists) |
1120 | 1156 |
|
1121 |
|
|
1122 | 1157 |
def test_004_disconnect_from_network(self): |
1123 | 1158 |
"Disconnecting server A and B from network" |
1124 | 1159 |
|
... | ... | |
1300 | 1335 |
if len(stale) == 0: |
1301 | 1336 |
return |
1302 | 1337 |
|
1303 |
print >> sys.stderr, "Found these stale servers from previous runs:"
|
|
1338 |
print >> sys.stderr, yellow + "Found these stale servers from previous runs:" + normal
|
|
1304 | 1339 |
print " " + \ |
1305 | 1340 |
"\n ".join(["%d: %s" % (s["id"], s["name"]) for s in stale]) |
1306 | 1341 |
|
... | ... | |
1308 | 1343 |
print >> sys.stderr, "Deleting %d stale servers:" % len(stale) |
1309 | 1344 |
for server in stale: |
1310 | 1345 |
c.delete_server(server["id"]) |
1311 |
print >> sys.stderr, " ...done"
|
|
1346 |
print >> sys.stderr, green + " ...done" + normal
|
|
1312 | 1347 |
else: |
1313 | 1348 |
print >> sys.stderr, "Use --delete-stale to delete them." |
1314 | 1349 |
|
... | ... | |
1323 | 1358 |
if len(stale) == 0: |
1324 | 1359 |
return |
1325 | 1360 |
|
1326 |
print >> sys.stderr, "Found these stale networks from previous runs:"
|
|
1361 |
print >> sys.stderr, yellow + "Found these stale networks from previous runs:" + normal
|
|
1327 | 1362 |
print " " + \ |
1328 | 1363 |
"\n ".join(["%s: %s" % (str(n["id"]), n["name"]) for n in stale]) |
1329 | 1364 |
|
... | ... | |
1331 | 1366 |
print >> sys.stderr, "Deleting %d stale networks:" % len(stale) |
1332 | 1367 |
for network in stale: |
1333 | 1368 |
c.delete_network(network["id"]) |
1334 |
print >> sys.stderr, " ...done"
|
|
1369 |
print >> sys.stderr, green + " ...done" + normal
|
|
1335 | 1370 |
else: |
1336 | 1371 |
print >> sys.stderr, "Use --delete-stale to delete them." |
1337 | 1372 |
|
1373 |
|
|
1338 | 1374 |
def parse_comma(option, opt, value, parser): |
1339 |
tests=set(['all', 'auth', 'images', 'flavors',
|
|
1375 |
tests = set(['all', 'auth', 'images', 'flavors',
|
|
1340 | 1376 |
'servers', 'server_spawn', 'network_spawn']) |
1341 | 1377 |
parse_input = value.split(',') |
1342 | 1378 |
|
... | ... | |
1357 | 1393 |
parser = OptionParser(**kw) |
1358 | 1394 |
parser.disable_interspersed_args() |
1359 | 1395 |
|
1360 |
|
|
1361 | 1396 |
parser.add_option("--api", |
1362 | 1397 |
action="store", type="string", dest="api", |
1363 | 1398 |
help="The API URI to use to reach the Synnefo API", |
... | ... | |
1448 | 1483 |
default="/var/log/burnin/") |
1449 | 1484 |
parser.add_option("--set-tests", |
1450 | 1485 |
action="callback", |
1451 |
dest = "tests",
|
|
1486 |
dest="tests",
|
|
1452 | 1487 |
type="string", |
1453 | 1488 |
help='Set comma seperated tests for this run. \ |
1454 | 1489 |
Available tests: auth, images, flavors, \ |
1455 |
servers, server_spawn, network_spawn. \ |
|
1490 |
servers, server_spawn, \ |
|
1491 |
network_spawn. \ |
|
1456 | 1492 |
Default = all', |
1457 | 1493 |
default='all', |
1458 | 1494 |
callback=parse_comma) |
1459 | 1495 |
|
1460 |
|
|
1461 | 1496 |
# FIXME: Change the default for build-fanout to 10 |
1462 | 1497 |
# FIXME: Allow the user to specify a specific set of Images to test |
1463 | 1498 |
|
... | ... | |
1469 | 1504 |
|
1470 | 1505 |
if not opts.show_stale: |
1471 | 1506 |
if not opts.force_imageid: |
1472 |
print >>sys.stderr, "The --image-id argument is mandatory. \n" |
|
1507 |
print >>sys.stderr, red + "The --image-id argument " \ |
|
1508 |
"is mandatory.\n" + normal |
|
1473 | 1509 |
parser.print_help() |
1474 | 1510 |
sys.exit(1) |
1475 | 1511 |
|
1476 | 1512 |
if not opts.token: |
1477 |
print >>sys.stderr, "The --token argument is mandatory. \n" |
|
1513 |
print >>sys.stderr, red + "The --token argument is " \ |
|
1514 |
"mandatory.\n" + normal |
|
1478 | 1515 |
parser.print_help() |
1479 | 1516 |
sys.exit(1) |
1480 | 1517 |
|
... | ... | |
1482 | 1519 |
try: |
1483 | 1520 |
opts.force_imageid = str(opts.force_imageid) |
1484 | 1521 |
except ValueError: |
1485 |
print >>sys.stderr, "Invalid value specified for --image-id." \
|
|
1486 |
"Use a valid id, or `all'."
|
|
1522 |
print >>sys.stderr, red + "Invalid value specified for" \
|
|
1523 |
"--image-id. Use a valid id, or `all'." + normal
|
|
1487 | 1524 |
sys.exit(1) |
1488 | 1525 |
|
1489 |
|
|
1490 |
|
|
1491 | 1526 |
return (opts, args) |
1492 | 1527 |
|
1493 | 1528 |
|
... | ... | |
1590 | 1625 |
query_interval=opts.query_interval, |
1591 | 1626 |
) |
1592 | 1627 |
|
1593 |
test_dict = {'auth':UnauthorizedTestCase, |
|
1594 |
'images':ImagesTestCase, |
|
1595 |
'flavors':FlavorsTestCase, |
|
1596 |
'servers':ServersTestCase, |
|
1597 |
'server_spawn':ServerTestCase, |
|
1598 |
'network_spawn':NetworkTestCase} |
|
1628 |
test_dict = {'auth': UnauthorizedTestCase,
|
|
1629 |
'images': ImagesTestCase,
|
|
1630 |
'flavors': FlavorsTestCase,
|
|
1631 |
'servers': ServersTestCase,
|
|
1632 |
'server_spawn': ServerTestCase,
|
|
1633 |
'network_spawn': NetworkTestCase}
|
|
1599 | 1634 |
|
1600 | 1635 |
seq_cases = [] |
1601 | 1636 |
if 'all' in opts.tests: |
... | ... | |
1605 | 1640 |
for test in opts.tests: |
1606 | 1641 |
seq_cases.append(test_dict[test]) |
1607 | 1642 |
|
1608 |
print seq_cases |
|
1609 |
sys.exit() |
|
1610 |
|
|
1611 |
|
|
1612 | 1643 |
#folder for each image |
1613 | 1644 |
image_folder = os.path.join(test_folder, imageid) |
1614 | 1645 |
os.mkdir(image_folder) |
1615 | 1646 |
|
1616 | 1647 |
for case in seq_cases: |
1648 |
|
|
1649 |
test = (key for key, value in test_dict.items() |
|
1650 |
if value == case).next() |
|
1651 |
|
|
1652 |
log.info(yellow + '* Starting testcase: %s' %test + normal) |
|
1617 | 1653 |
log_file = os.path.join(image_folder, 'details_' + |
1618 | 1654 |
(case.__name__) + "_" + |
1619 | 1655 |
TEST_RUN_ID + '.log') |
... | ... | |
1633 | 1669 |
result = runner.run(suite) |
1634 | 1670 |
|
1635 | 1671 |
for res in result.errors: |
1672 |
log.error("snf-burnin encountered an error in " \ |
|
1673 |
"testcase: %s" %test) |
|
1674 |
log.error("See log for details") |
|
1636 | 1675 |
error.write(str(res[0]) + '\n') |
1637 | 1676 |
error.write(str(res[0].shortDescription()) + '\n') |
1638 | 1677 |
error.write('\n') |
1639 | 1678 |
|
1640 | 1679 |
for res in result.failures: |
1680 |
log.error("snf-burnin failed in testcase: %s" %test) |
|
1681 |
log.error("See log for details") |
|
1641 | 1682 |
fail.write(str(res[0]) + '\n') |
1642 | 1683 |
fail.write(str(res[0].shortDescription()) + '\n') |
1643 | 1684 |
fail.write('\n') |
1644 | 1685 |
if opts.nofailfast == False: |
1645 | 1686 |
sys.exit() |
1646 | 1687 |
|
1688 |
if (len(result.failures) == 0) and (len(result.errors) == 0): |
|
1689 |
log.debug("Passed testcase: %s" %test) |
|
1690 |
|
|
1647 | 1691 |
if __name__ == "__main__": |
1648 | 1692 |
sys.exit(main()) |
Also available in: Unified diff