Revision 746540cd

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