cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTest Manager - TestBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__copyright__ = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__version__ = "$Revision$"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard python imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport unittest;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.core.base import ModelDataBase, ModelDataBaseTestCase, ModelLogicBase, TMExceptionBase, \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ChangeLogEntry, AttributeChangeEntry;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# pylint: disable=C0103
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass TestBoxData(ModelDataBase): # pylint: disable=R0902
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TestBox Data.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## LomKind_T
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksLomKind_None = 'none';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksLomKind_ILOM = 'ilom';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksLomKind_ELOM = 'elom';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksLomKind_AppleXserveLom = 'apple-xserver-lom';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasLomKindValues = [ ksLomKind_None, ksLomKind_ILOM, ksLomKind_ELOM, ksLomKind_AppleXserveLom];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kaoLomKindDescs = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync [
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksLomKind_None, 'None', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksLomKind_ILOM, 'ILOM', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksLomKind_ELOM, 'ELOM', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksLomKind_AppleXserveLom, 'Apple Xserve LOM', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## TestBoxCmd_T
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_None = 'none';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_Abort = 'abort';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_Reboot = 'reboot';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_Upgrade = 'upgrade';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_UpgradeAndReboot = 'upgrade-and-reboot';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_Special = 'special';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasTestBoxCmdValues = [ ksTestBoxCmd_None, ksTestBoxCmd_Abort, ksTestBoxCmd_Reboot, ksTestBoxCmd_Upgrade,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksTestBoxCmd_UpgradeAndReboot, ksTestBoxCmd_Special];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kaoTestBoxCmdDescs = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync [
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_None, 'None', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_Abort, 'Abort current test', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_Reboot, 'Reboot TestBox', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_Upgrade, 'Upgrade TestBox Script', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_UpgradeAndReboot, 'Upgrade TestBox Script and reboot', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ( ksTestBoxCmd_Special, 'Special (reserved)', ''),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksIdAttr = 'idTestBox';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksIdGenAttr = 'idGenTestBox';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_idTestBox = 'TestBox_idTestBox';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_tsEffective = 'TestBox_tsEffective';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_tsExpire = 'TestBox_tsExpire';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_uidAuthor = 'TestBox_uidAuthor';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_idGenTestBox = 'TestBox_idGenTestBox';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_ip = 'TestBox_ip';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_uuidSystem = 'TestBox_uuidSystem';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sName = 'TestBox_sName';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sDescription = 'TestBox_sDescription';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_idSchedGroup = 'TestBox_idSchedGroup';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_fEnabled = 'TestBox_fEnabled';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_enmLomKind = 'TestBox_enmLomKind';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_ipLom = 'TestBox_ipLom';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_pctScaleTimeout = 'TestBox_pctScaleTimeout';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sOs = 'TestBox_sOs';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sOsVersion = 'TestBox_sOsVersion';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sCpuVendor = 'TestBox_sCpuVendor';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sCpuArch = 'TestBox_sCpuArch';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sCpuName = 'TestBox_sCpuName';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_lCpuRevision = 'TestBox_lCpuRevision';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_cCpus = 'TestBox_cCpus';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_fCpuHwVirt = 'TestBox_fCpuHwVirt';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_fCpuNestedPaging = 'TestBox_fCpuNestedPaging';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_fCpu64BitGuest = 'TestBox_fCpu64BitGuest';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_fChipsetIoMmu = 'TestBox_fChipsetIoMmu';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_cMbMemory = 'TestBox_cMbMemory';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_cMbScratch = 'TestBox_cMbScratch';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_sReport = 'TestBox_sReport';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_iTestBoxScriptRev = 'TestBox_iTestBoxScriptRev';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_iPythonHexVersion = 'TestBox_iPythonHexVersion';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksParam_enmPendingCmd = 'TestBox_enmPendingCmd';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasAllowNullAttributes = ['idTestBox', 'tsEffective', 'tsExpire', 'uidAuthor', 'idGenTestBox', 'sDescription',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ipLom', 'sOs', 'sOsVersion', 'sCpuVendor', 'sCpuArch', 'sCpuName', 'lCpuRevision', 'cCpus',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'fCpuHwVirt', 'fCpuNestedPaging', 'fCpu64BitGuest', 'fChipsetIoMmu', 'cMbMemory',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'cMbScratch', 'sReport', 'iTestBoxScriptRev', 'iPythonHexVersion' ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasValidValues_enmLomKind = kasLomKindValues;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kasValidValues_enmPendingCmd = kasTestBoxCmdValues;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kiMin_pctScaleTimeout = 11;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kiMax_pctScaleTimeout = 19999;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync kcchMax_sReport = 65535;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ModelDataBase.__init__(self);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Initialize with defaults.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # See the database for explanations of each of these fields.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idTestBox = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsEffective = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsExpire = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.uidAuthor = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idGenTestBox = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.ip = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.uuidSystem = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sName = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sDescription = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idSchedGroup = 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fEnabled = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.enmLomKind = self.ksLomKind_None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.ipLom = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.pctScaleTimeout = 100;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sOs = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sOsVersion = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuVendor = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuArch = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuName = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.lCpuRevision = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cCpus = 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpuHwVirt = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpuNestedPaging = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpu64BitGuest = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fChipsetIoMmu = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cMbMemory = 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cMbScratch = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sReport = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iTestBoxScriptRev = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iPythonHexVersion = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.enmPendingCmd = self.ksTestBoxCmd_None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromDbRow(self, aoRow):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Internal worker for initFromDbWithId and initFromDbWithGenId as well as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync from TestBoxLogic. Expecting a SELECT * FROM TestBoxes result.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoRow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('TestBox not found.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idTestBox = aoRow[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsEffective = aoRow[1];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.tsExpire = aoRow[2];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.uidAuthor = aoRow[3];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idGenTestBox = aoRow[4];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.ip = aoRow[5];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.uuidSystem = aoRow[6];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sName = aoRow[7];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sDescription = aoRow[8];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.idSchedGroup = aoRow[9];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fEnabled = aoRow[10];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.enmLomKind = aoRow[11];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.ipLom = aoRow[12];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.pctScaleTimeout = aoRow[13];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sOs = aoRow[14];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sOsVersion = aoRow[15];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuVendor = aoRow[16];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuArch = aoRow[17];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sCpuName = aoRow[18];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.lCpuRevision = aoRow[19];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cCpus = aoRow[20];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpuHwVirt = aoRow[21];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpuNestedPaging = aoRow[22];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fCpu64BitGuest = aoRow[23];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.fChipsetIoMmu = aoRow[24];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cMbMemory = aoRow[25];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cMbScratch = aoRow[26];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sReport = aoRow[27];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iTestBoxScriptRev = aoRow[28];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iPythonHexVersion = aoRow[29];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.enmPendingCmd = aoRow[30];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromDbWithId(self, oDb, idTestBox, tsNow = None, sPeriodBack = None):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Initialize the object from the database.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oDb.execute(self.formatSimpleNowAndPeriodQuery(oDb,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , ( idTestBox, ), tsNow, sPeriodBack));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRow = oDb.fetchOne()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoRow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('idTestBox=%s not found (tsNow=%s sPeriodBack=%s)' % (idTestBox, tsNow, sPeriodBack,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.initFromDbRow(aoRow);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def initFromDbWithGenId(self, oDb, idGenTestBox):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Initialize the object from the database.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oDb.execute('SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idGenTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (idGenTestBox, ) );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.initFromDbRow(oDb.fetchOne());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _validateAndConvertWorker(self, asAllowNullAttributes, oDb):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Override to do extra ipLom checks.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dErrors = ModelDataBase._validateAndConvertWorker(self, asAllowNullAttributes, oDb);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self.ksParam_ipLom not in dErrors \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and self.ksParam_enmLomKind not in dErrors \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and self.enmLomKind != self.ksLomKind_None \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and self.ipLom is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dErrors[self.ksParam_ipLom] = 'Light-out-management IP is mandatory and a LOM is selected.'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return dErrors;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def formatPythonVersion(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Unbuttons the version number and formats it as a version string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self.iPythonHexVersion is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 'N/A';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 'v%d.%d.%d.%d' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( self.iPythonHexVersion >> 24,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (self.iPythonHexVersion >> 16) & 0xff,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (self.iPythonHexVersion >> 8) & 0xff,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.iPythonHexVersion & 0xff);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def getCpuFamily(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the CPU family for a x86 or amd64 testboxes."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self.lCpuRevision is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (self.lCpuRevision >> 24 & 0xff);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def getCpuModel(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the CPU model for a x86 or amd64 testboxes."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self.lCpuRevision is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (self.lCpuRevision >> 8 & 0xffff);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def getCpuStepping(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the CPU stepping for a x86 or amd64 testboxes."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self.lCpuRevision is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (self.lCpuRevision & 0xff);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass TestBoxLogic(ModelLogicBase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TestBox logic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self, oDb):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ModelLogicBase.__init__(self, oDb);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def tryFetchTestBoxByUuid(self, sTestBoxUuid):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Tries to fetch a testbox by its UUID alone.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE uuidSystem = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::timestamp\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY tsEffective DESC\n',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (sTestBoxUuid,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._oDb.getRowCount() == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._oDb.getRowCount() != 1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('Database integrity error: %u hits' % (self._oDb.getRowCount(),));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData = TestBoxData();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.initFromDbRow(self._oDb.fetchOne());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return oData;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def fetchForListing(self, iStart, cMaxRows, tsNow):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Fetches testboxes for listing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns an array (list) of TestBoxData items, empty list if none. The
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TestBoxData instances have an extra oStatus member that is either None or
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync a TestBoxStatusData instance, and a member tsCurrent holding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync CURRENT_TIMESTAMP.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on error.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync from testmanager.core.testboxstatus import TestBoxStatusData;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if tsNow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT TestBoxes.*, TestBoxStatuses.*\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LEFT OUTER JOIN TestBoxStatuses ON (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' TestBoxStatuses.idTestBox = TestBoxes.idTestBox )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE tsExpire = \'infinity\'::TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY sName\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT %s OFFSET %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (cMaxRows, iStart,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT TestBoxes.*, TestBoxStatuses.*\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LEFT OUTER JOIN TestBoxStatuses ON (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' TestBoxStatuses.idTestBox = TestBoxes.idTestBox )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE tsExpire > %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsEffective <= %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY sName\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT %s OFFSET %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (tsNow, tsNow, cMaxRows, iStart,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for aoOne in self._oDb.fetchAll():
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestBox = TestBoxData().initFromDbRow(aoOne);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestBox.tsCurrent = self._oDb.getCurrentTimestamp(); # pylint: disable=W0201
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestBox.oStatus = None; # pylint: disable=W0201
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoOne[31] is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestBox.oStatus = TestBoxStatusData().initFromDbRow(aoOne[31:]); # pylint: disable=W0201
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows.append(oTestBox);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aoRows;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def fetchForChangeLog(self, idTestBox, iStart, cMaxRows, tsNow): # pylint: disable=R0914
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Fetches change log entries for a testbox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns an array of ChangeLogEntry instance and an indicator whether
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync there are more entries.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Raises exception on error.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if tsNow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsNow = self._oDb.getCurrentTimestamp();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT TestBoxes.*, Users.sUsername\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LEFT OUTER JOIN Users \n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ON ( TestBoxes.uidAuthor = Users.uid\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND Users.tsEffective <= TestBoxes.tsEffective\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND Users.tsExpire > TestBoxes.tsEffective)\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE TestBoxes.tsEffective <= %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND TestBoxes.idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'ORDER BY TestBoxes.tsExpire DESC\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'LIMIT %s OFFSET %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (tsNow, idTestBox, cMaxRows + 1, iStart,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for _ in range(self._oDb.getRowCount()):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oRow = self._oDb.fetchOne();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRows.append([TestBoxData().initFromDbRow(oRow), oRow[-1],]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Calculate the changes.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoEntries = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for i in range(0, len(aoRows) - 1):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oNew, sAuthor) = aoRows[i];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oOld, _ ) = aoRows[i + 1];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoChanges = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sAttr in oNew.getDataAttributes():
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sAttr not in [ 'tsEffective', 'tsExpire', 'uidAuthor']:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oOldAttr = getattr(oOld, sAttr);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oNewAttr = getattr(oNew, sAttr);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oOldAttr != oNewAttr:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoChanges.append(AttributeChangeEntry(sAttr, oNewAttr, oOldAttr, str(oNewAttr), str(oOldAttr)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoEntries.append(ChangeLogEntry(oNew.uidAuthor, sAuthor, oNew.tsEffective, oNew.tsExpire, oNew, oOld, aoChanges));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # If we're at the end of the log, add the initial entry.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aoRows) <= cMaxRows and len(aoRows) > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oNew, sAuthor) = aoRows[-1];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoEntries.append(ChangeLogEntry(oNew.uidAuthor, aoRows[-1][1], oNew.tsEffective, oNew.tsExpire, oNew, None, []));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (aoEntries, len(aoRows) > cMaxRows);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addEntry(self, oData, uidAuthor, fCommit = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Creates a testbox in the database.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns the testbox ID, testbox generation ID and effective timestamp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync of the created testbox on success. Throws error on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dDataErrors = oData.validateAndConvert(self._oDb);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(dDataErrors) > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('Invalid data passed to create(): %s' % (dDataErrors,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('INSERT INTO TestBoxes (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' tsEffective,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' tsExpire,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idGenTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ip,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sReport,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmPendingCmd\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' )'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'VALUES (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' DEFAULT,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' CURRENT_TIMESTAMP,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' DEFAULT,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' DEFAULT,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # ip
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # uuidSystem
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sName
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sDescription
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # idSchedGroup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fEnabled
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # enmLomKind
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # ipLom
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # pctScaleTimeout
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sOs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sOsVersion
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuVendor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuArch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuName
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # lCpuRevision
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cCpus
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpuHwVirt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpuNestedPaging
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpu64BitGuest
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fChipsetIoMmu
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cMbMemory
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cMbScratch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sReport
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # iTestBoxScriptRev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # iPythonHexVersion
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s\n' # enmPendingCmd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING idTestBox, idGenTestBox, tsEffective'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (uidAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.ip,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.uuidSystem,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sName,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sDescription,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.idSchedGroup,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fEnabled,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.enmLomKind,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.ipLom,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.pctScaleTimeout,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sOs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sOsVersion,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sCpuVendor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sCpuArch,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sCpuName,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.lCpuRevision,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.cCpus,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fCpuHwVirt,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fCpuNestedPaging,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fCpu64BitGuest,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fChipsetIoMmu,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.cMbMemory,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.cMbScratch,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sReport,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.iTestBoxScriptRev,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.iPythonHexVersion,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.enmPendingCmd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync )
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oRow = self._oDb.fetchOne();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.maybeCommit(fCommit);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (oRow[0], oRow[1], oRow[2]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def editEntry(self, oData, uidAuthor, fCommit = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Data edit update, web UI is the primary user.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns the new generation ID and effective date.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dDataErrors = oData.validateAndConvert(self._oDb);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(dDataErrors) > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('Invalid data passed to create(): %s' % (dDataErrors,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo check if the data changed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE ONLY TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SET tsExpire = CURRENT_TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idGenTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::timestamp\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING tsExpire\n',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oData.idGenTestBox,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective = self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Would be easier to do this using an insert or update hook, I think. Much easier.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('INSERT INTO TestBoxes (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idGenTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' tsEffective,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ip,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmPendingCmd\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SELECT NEXTVAL(\'TestBoxGenIdSeq\'),\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # tsEffective
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # ip
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # uuidSystem
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sName
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sDescription
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # idSchedGroup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fEnabled
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # enmLomKind
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # ipLom
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # pctScaleTimeout
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s\n' # enmPendingCmd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idGenTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING idGenTestBox, tsEffective'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync uidAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.ip,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.uuidSystem,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sName,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.sDescription,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.idSchedGroup,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.fEnabled,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.enmLomKind,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.ipLom,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.pctScaleTimeout,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.enmPendingCmd,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData.idGenTestBox,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aRow = self._oDb.fetchOne();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aRow is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise TMExceptionBase('Insert failed? oRow=None');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync idGenTestBox = aRow[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective = aRow[1];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.maybeCommit(fCommit);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.rollback();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (idGenTestBox, tsEffective);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def updateOnSignOn(self, idTestBox, idGenTestBox, sTestBoxAddr, sOs, sOsVersion, # pylint: disable=R0913,R0914
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCpuVendor, sCpuArch, sCpuName, lCpuRevision, cCpus, fCpuHwVirt, fCpuNestedPaging, fCpu64BitGuest,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChipsetIoMmu, cMbMemory, cMbScratch, sReport, iTestBoxScriptRev, iPythonHexVersion):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Update the testbox attributes automatically on behalf of the testbox script.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns the new generation id on success, raises an exception on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Would be easier to do this using an insert or update hook, I think. Much easier.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE ONLY TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SET tsExpire = CURRENT_TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idGenTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::timestamp\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING tsExpire\n',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (idGenTestBox,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective = self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('INSERT INTO TestBoxes (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idGenTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' tsEffective,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ip,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sReport,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmPendingCmd\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SELECT NEXTVAL(\'TestBoxGenIdSeq\'),\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' NULL,\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sOs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sOsVersion
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuVendor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuArch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sCpuName
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # lCpuRevision
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cCpus
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpuHwVirt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpuNestedPaging
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fCpu64BitGuest
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # fChipsetIoMmu
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cMbMemory
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # cMbScratch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # sReport
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # iTestBoxScriptRev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # iPythonHexVersion
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmPendingCmd\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idGenTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING idGenTestBox'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (idTestBox,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sTestBoxAddr,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sOs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sOsVersion,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCpuVendor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCpuArch,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCpuName,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lCpuRevision,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cCpus,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fCpuHwVirt,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fCpuNestedPaging,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fCpu64BitGuest,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChipsetIoMmu,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cMbMemory,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cMbScratch,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sReport,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iTestBoxScriptRev,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iPythonHexVersion,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync idGenTestBox,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync idGenTestBox = self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.commit();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.rollback();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return idGenTestBox;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def setCommand(self, idTestBox, sOldCommand, sNewCommand, uidAuthor = None, fCommit = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Sets or resets the pending command on a testbox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns (idGenTestBox, tsEffective) of the new row.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Would be easier to do this using an insert or update hook, I think. Much easier.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE ONLY TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SET tsExpire = CURRENT_TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::timestamp\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND enmPendingCmd = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING tsExpire\n',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (idTestBox, sOldCommand,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective = self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('INSERT INTO TestBoxes (\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idGenTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idTestBox,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' tsEffective,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ip,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sReport,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmPendingCmd\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' )\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SELECT NEXTVAL(\'TestBoxGenIdSeq\'),\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # idTestBox
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # tsEffective
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s,\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ip,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uuidSystem,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sDescription,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' idSchedGroup,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fEnabled,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' enmLomKind,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' ipLom,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' pctScaleTimeout,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOs,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sOsVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuVendor,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuArch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sCpuName,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' lCpuRevision,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cCpus,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuHwVirt,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpuNestedPaging,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fCpu64BitGuest,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' fChipsetIoMmu,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbMemory,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' cMbScratch,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' sReport,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iTestBoxScriptRev,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' iPythonHexVersion,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' %s\n' # enmPendingCmd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND enmPendingCmd = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'RETURNING idGenTestBox'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (idTestBox,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync uidAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sNewCommand,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync idTestBox,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sOldCommand,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync idGenTestBox = self._oDb.fetchOne()[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fCommit is True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.commit();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.rollback();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (idGenTestBox, tsEffective);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def getAll(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Retrieve list of all registered Test Box records from DB.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('SELECT *\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'FROM TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE tsExpire=\'infinity\'::timestamp;')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aaoRows = self._oDb.fetchAll()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRet = []
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for aoRow in aaoRows:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoRet.append(TestBoxData().initFromDbRow(aoRow))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aoRet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _historize(self, idTestBox, uidAuthor, tsExpire = None):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Historizes the current entry. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if tsExpire is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SET tsExpire = CURRENT_TIMESTAMP,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (uidAuthor, idTestBox,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.execute('UPDATE TestBoxes\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'SET tsExpire = %s,\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' uidAuthor = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'WHERE idTestBox = %s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' AND tsExpire = \'infinity\'::TIMESTAMP\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync , (uidAuthor, tsExpire, idTestBox,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def removeEntry(self, uidAuthor, idTestBox, fCascade = False, fCommit=False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Delete user account
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync _ = fCascade;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._historize(idTestBox, uidAuthor, None);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._oDb.maybeCommit(fCommit);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Unit testing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# pylint: disable=C0111
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass TestBoxDataTestCase(ModelDataBaseTestCase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def setUp(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.aoSamples = [TestBoxData(),];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncif __name__ == '__main__':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unittest.main();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # not reached.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync