def _validateAndConvertData(self, oData, enmValidateFor):
        # type: (TestBoxDataEx, str) -> None
        """
        Helper for addEntry and editEntry that validates the scheduling group IDs in
        addtion to what's covered by the default validateAndConvert of the data object.

        Raises exception on invalid input.
        """
        dDataErrors = oData.validateAndConvert(self._oDb, enmValidateFor)
        if len(dDataErrors) > 0:
            raise TMInvalidData('TestBoxLogic.addEntry: %s' % (dDataErrors, ))
        if isinstance(oData, TestBoxDataEx):
            if len(oData.aoInSchedGroups):
                sSchedGrps = ', '.join('(%s)' % oCur.idSchedGroup
                                       for oCur in oData.aoInSchedGroups)
                self._oDb.execute(
                    'SELECT   SchedGroupIDs.idSchedGroup\n'
                    'FROM     (VALUES ' + sSchedGrps +
                    ' ) AS SchedGroupIDs(idSchedGroup)\n'
                    '         LEFT OUTER JOIN SchedGroups\n'
                    '                      ON     SchedGroupIDs.idSchedGroup = SchedGroups.idSchedGroup\n'
                    '                         AND SchedGroups.tsExpire = \'infinity\'::TIMESTAMP\n'
                    'WHERE    SchedGroups.idSchedGroup IS NULL\n')
                aaoRows = self._oDb.fetchAll()
                if len(aaoRows) > 0:
                    raise TMInvalidData(
                        'TestBoxLogic.addEntry missing scheduling groups: %s' %
                        (', '.join(str(aoRow[0]) for aoRow in aaoRows), ))
        return None
Example #2
0
    def editEntry(self, oData, uidAuthor, fCommit=False):
        """
        Modifies a failure reason category.
        """

        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, FailureCategoryData)
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if dErrors:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))

        oOldData = FailureCategoryData().initFromDbWithId(
            self._oDb, oData.idFailureCategory)

        #
        # Update the data that needs updating.
        #
        if not oData.isEqualEx(oOldData, [
                'tsEffective',
                'tsExpire',
                'uidAuthor',
        ]):
            self._historizeEntry(oData.idFailureCategory)
            self._readdEntry(uidAuthor, oData)
        self._oDb.maybeCommit(fCommit)
        return True
Example #3
0
    def addEntry(self, oData, uidAuthor, fCommit=False):
        """
        Adds a testgroup to the database.
        """

        #
        # Validate inputs.
        #
        assert isinstance(oData, TestGroupDataEx)
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Add)
        if dErrors:
            raise TMInvalidData('addEntry invalid input: %s' % (dErrors, ))
        self._assertUniq(oData, None)

        #
        # Do the job.
        #
        self._oDb.execute(
            'INSERT INTO TestGroups (uidAuthor, sName, sDescription, sComment)\n'
            'VALUES (%s, %s, %s, %s)\n'
            'RETURNING idTestGroup\n',
            (uidAuthor, oData.sName, oData.sDescription, oData.sComment))
        idTestGroup = self._oDb.fetchOne()[0]
        oData.idTestGroup = idTestGroup

        for oMember in oData.aoMembers:
            oMember.idTestGroup = idTestGroup
            self._insertTestGroupMember(uidAuthor, oMember)

        self._oDb.maybeCommit(fCommit)
        return True
Example #4
0
    def addBuildCategory(self, oData, fCommit=False):
        """
        Add Build Category record into the database if needed, returning updated oData.
        Raises exception on input and database errors.
        """

        # Check BuildCategoryData before do anything
        dDataErrors = oData.validateAndConvert(self._oDb,
                                               oData.ksValidateFor_Add)
        if dDataErrors:
            raise TMInvalidData(
                'Invalid data passed to addBuildCategory(): %s' %
                (dDataErrors, ))

        # Does it already exist?
        if self.tryFindByData(oData) is None:
            # No, We'll have to add it.
            self._oDb.execute(
                'INSERT INTO BuildCategories (sProduct, sRepository, sBranch, sType, asOsArches)\n'
                'VALUES (%s, %s, %s, %s, %s)\n'
                'RETURNING idBuildCategory', (
                    oData.sProduct,
                    oData.sRepository,
                    oData.sBranch,
                    oData.sType,
                    sorted(oData.asOsArches),
                ))
            oData.idBuildCategory = self._oDb.fetchOne()[0]

        self._oDb.maybeCommit(fCommit)
        return oData
    def editEntry(self, oData, uidAuthor, fCommit=False):
        """
        Modifies a test result failure reason.
        """

        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, TestResultFailureData)
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if len(dErrors) > 0:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))

        oOldData = self.getById(oData.idTestResult)
        oData.idTestSet = oOldData.idTestSet

        #
        # Update the data that needs updating.
        #
        if not oData.isEqualEx(oOldData, [
                'tsEffective',
                'tsExpire',
                'uidAuthor',
        ]):
            self._historizeEntry(oData.idTestResult)
            self._readdEntry(uidAuthor, oData)
        self._oDb.maybeCommit(fCommit)
        return True
    def addEntry(self, oData, uidAuthor, fCommit=False):
        """
        Add a test result failure reason record.
        """

        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, TestResultFailureData)
        dErrors = oData.validateAndConvert(self._oDb,
                                           oData.ksValidateFor_AddForeignId)
        if len(dErrors) > 0:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))

        # Check if it exist first (we're adding, not editing, collisions not allowed).
        oOldData = self.getById(oData.idTestResult)
        if oOldData is not None:
            raise TMRowAlreadyExists(
                'TestResult %d already have a failure reason associated with it:'
                '%s\n'
                'Perhaps someone else beat you to it? Or did you try resubmit?'
                % (oData.idTestResult, oOldData))
        oData = self._resolveSetTestIdIfMissing(oData)

        #
        # Add record.
        #
        self._readdEntry(uidAuthor, oData)
        self._oDb.maybeCommit(fCommit)
        return True
    def editEntry(self, oData, uidAuthor, fCommit=False):
        """Edit Scheduling Group record"""

        #
        # Validate input and retrieve the old data.
        #
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if dErrors:
            raise TMInvalidData('editEntry got invalid data: %s' % (dErrors, ))
        self._assertUnique(oData.sName, oData.idSchedGroup)
        oOldData = SchedGroupDataEx().initFromDbWithId(self._oDb,
                                                       oData.idSchedGroup)

        #
        # Make the changes.
        #
        if not oData.isEqualEx(oOldData, [
                'tsEffective',
                'tsExpire',
                'uidAuthor',
                'aoMembers',
                'aoTestBoxes',
                'oBuildSrc',
                'oBuildSrcValidationKit',
        ]):
            self._historizeEntry(oData.idSchedGroup)
            self._readdEntry(uidAuthor, oData)

        # Remove groups.
        for oOld in oOldData.aoMembers:
            fRemove = True
            for oNew in oData.aoMembers:
                if oNew.idTestGroup == oOld.idTestGroup:
                    fRemove = False
                    break
            if fRemove:
                self._removeSchedGroupMember(uidAuthor, oOld)

        # Add / modify groups.
        for oMember in oData.aoMembers:
            oOldMember = None
            for oOld in oOldData.aoMembers:
                if oOld.idTestGroup == oMember.idTestGroup:
                    oOldMember = oOld
                    break

            oMember.idSchedGroup = oData.idSchedGroup
            if oOldMember is None:
                self._addSchedGroupMember(uidAuthor, oMember)
            elif not oMember.isEqualEx(
                    oOldMember,
                ['tsEffective', 'tsExpire', 'uidAuthor', 'oTestGroup']):
                self._historizeSchedGroupMember(oMember)
                self._addSchedGroupMember(uidAuthor, oMember)

        self._oDb.maybeCommit(fCommit)
        return True
    def editEntry(self, oData, uidAuthor, fCommit=False):
        """
        Modifies a build source.
        """

        #
        # Validate the input and read the old entry.
        #
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if dErrors:
            raise TMInvalidData('addEntry invalid input: %s' % (dErrors, ))
        self._assertUnique(oData, oData.idBuildSrc)
        oOldData = BuildSourceData().initFromDbWithId(self._oDb,
                                                      oData.idBuildSrc)

        #
        # Make the changes (if something actually changed).
        #
        if not oData.isEqualEx(oOldData, [
                'tsEffective',
                'tsExpire',
                'uidAuthor',
        ]):
            self._historizeBuildSource(oData.idBuildSrc)
            self._oDb.execute(
                'INSERT INTO BuildSources (\n'
                '         uidAuthor,\n'
                '         idBuildSrc,\n'
                '         sName,\n'
                '         sDescription,\n'
                '         sProduct,\n'
                '         sBranch,\n'
                '         asTypes,\n'
                '         asOsArches,\n'
                '         iFirstRevision,\n'
                '         iLastRevision,\n'
                '         cSecMaxAge)\n'
                'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n', (
                    uidAuthor,
                    oData.idBuildSrc,
                    oData.sName,
                    oData.sDescription,
                    oData.sProduct,
                    oData.sBranch,
                    oData.asTypes,
                    oData.asOsArches,
                    oData.iFirstRevision,
                    oData.iLastRevision,
                    oData.cSecMaxAge,
                ))
        self._oDb.maybeCommit(fCommit)
        return True
Example #9
0
    def addEntry(self, oData, uidAuthor, fCommit=False):
        """
        Add a failure reason.
        """
        #
        # Validate.
        #
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Add)
        if dErrors:
            raise TMInvalidData('addEntry invalid input: %s' % (dErrors, ))

        #
        # Add the record.
        #
        self._readdEntry(uidAuthor, oData)
        self._oDb.maybeCommit(fCommit)
        return True
Example #10
0
    def addEntry(self, oData, uidAuthor, fCommit=False):
        """
        Add a failure reason category.
        """
        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, FailureCategoryData)
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Add)
        if dErrors:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))

        #
        # Add the record.
        #
        self._readdEntry(uidAuthor, oData)
        self._oDb.maybeCommit(fCommit)
        return True
    def addEntry(self, oData, uidAuthor, fCommit=False):
        """
        Add a new build source to the database.
        """

        #
        # Validate the input.
        #
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Add)
        if dErrors:
            raise TMInvalidData('addEntry invalid input: %s' % (dErrors, ))
        self._assertUnique(oData, None)

        #
        # Add it.
        #
        self._oDb.execute(
            'INSERT INTO BuildSources (\n'
            '         uidAuthor,\n'
            '         sName,\n'
            '         sDescription,\n'
            '         sProduct,\n'
            '         sBranch,\n'
            '         asTypes,\n'
            '         asOsArches,\n'
            '         iFirstRevision,\n'
            '         iLastRevision,\n'
            '         cSecMaxAge)\n'
            'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n', (
                uidAuthor,
                oData.sName,
                oData.sDescription,
                oData.sProduct,
                oData.sBranch,
                oData.asTypes,
                oData.asOsArches,
                oData.iFirstRevision,
                oData.iLastRevision,
                oData.cSecMaxAge,
            ))

        self._oDb.maybeCommit(fCommit)
        return True
Example #12
0
    def addEntry(self, oData, uidAuthor, fCommit = False):
        """Add Scheduling Group record"""

        #
        # Validate.
        #
        dDataErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Add);
        if dDataErrors:
            raise TMInvalidData('Invalid data passed to addEntry: %s' % (dDataErrors,));
        if self.exists(oData.sName):
            raise TMRowAlreadyExists('Scheduling group "%s" already exists.' % (oData.sName,));

        #
        # Add it.
        #
        self._oDb.execute('INSERT INTO SchedGroups (\n'
                          '         uidAuthor,\n'
                          '         sName,\n'
                          '         sDescription,\n'
                          '         fEnabled,\n'
                          '         enmScheduler,\n'
                          '         idBuildSrc,\n'
                          '         idBuildSrcTestSuite,\n'
                          '         sComment)\n'
                          'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)\n'
                          'RETURNING idSchedGroup\n'
                          , ( uidAuthor,
                              oData.sName,
                              oData.sDescription,
                              oData.fEnabled,
                              oData.enmScheduler,
                              oData.idBuildSrc,
                              oData.idBuildSrcTestSuite,
                              oData.sComment ));
        idSchedGroup = self._oDb.fetchOne()[0];
        oData.idSchedGroup = idSchedGroup;

        for oMember in oData.aoMembers:
            oMember.idSchedGroup = idSchedGroup;
            self._addSchedGroupMember(uidAuthor, oMember);

        self._oDb.maybeCommit(fCommit);
        return True;
Example #13
0
    def editEntry(self, oData, uidAuthor=None, fCommit=False):
        """Modify database record"""

        #
        # Validate input and get current data.
        #
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if dErrors:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))
        oOldData = BuildData().initFromDbWithId(self._oDb, oData.idBuild)

        #
        # Do the work.
        #
        if not oData.isEqualEx(oOldData,
                               ['tsEffective', 'tsExpire', 'uidAuthor']):
            self._historizeBuild(oData.idBuild)
            self._oDb.execute(
                'INSERT INTO Builds (uidAuthor,\n'
                '                    idBuild,\n'
                '                    tsCreated,\n'
                '                    idBuildCategory,\n'
                '                    iRevision,\n'
                '                    sVersion,\n'
                '                    sLogUrl,\n'
                '                    sBinaries,\n'
                '                    fBinariesDeleted)\n'
                'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)\n'
                'RETURNING idBuild, tsCreated\n', (
                    uidAuthor,
                    oData.idBuild,
                    oData.tsCreated,
                    oData.idBuildCategory,
                    oData.iRevision,
                    oData.sVersion,
                    oData.sLogUrl,
                    oData.sBinaries,
                    oData.fBinariesDeleted,
                ))

        self._oDb.maybeCommit(fCommit)
        return True
Example #14
0
    def editEntry(self, oData, uidAuthor, fCommit = False):
        """
        Modifies a blacklisting.
        """

        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, BuildBlacklistData);
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit);
        if dErrors:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors,));

        oOldData = BuildBlacklistData().initFromDbWithId(self._oDb, oData.idBlacklisting);

        #
        # Update the data that needs updating.
        #
        if not oData.isEqualEx(oOldData, [ 'tsEffective', 'tsExpire', 'uidAuthor', ]):
            self._historizeEntry(oData.idBlacklisting, None);
            self._readdEntry(uidAuthor, oData, None);
        self._oDb.maybeCommit(fCommit);
        return True;
Example #15
0
    def editEntry(self, oData, uidAuthor, fCommit=False):
        """
        Modifies a test group.
        """

        #
        # Validate inputs and read in the old(/current) data.
        #
        assert isinstance(oData, TestGroupDataEx)
        dErrors = oData.validateAndConvert(self._oDb, oData.ksValidateFor_Edit)
        if dErrors:
            raise TMInvalidData('editEntry invalid input: %s' % (dErrors, ))
        self._assertUniq(oData, oData.idTestGroup)

        oOldData = TestGroupDataEx().initFromDbWithId(self._oDb,
                                                      oData.idTestGroup)

        #
        # Update the data that needs updating.
        #

        if not oData.isEqualEx(oOldData, [
                'aoMembers',
                'tsEffective',
                'tsExpire',
                'uidAuthor',
        ]):
            self._historizeTestGroup(oData.idTestGroup)
            self._oDb.execute(
                'INSERT INTO TestGroups\n'
                '       (uidAuthor, idTestGroup, sName, sDescription, sComment)\n'
                'VALUES (%s, %s, %s, %s, %s)\n',
                (uidAuthor, oData.idTestGroup, oData.sName, oData.sDescription,
                 oData.sComment))

        # Create a lookup dictionary for old entries.
        dOld = {}
        for oOld in oOldData.aoMembers:
            dOld[oOld.idTestCase] = oOld
        assert len(dOld) == len(oOldData.aoMembers)

        # Add new members, updated existing ones.
        dNew = {}
        for oNewMember in oData.aoMembers:
            oNewMember.idTestGroup = oData.idTestGroup
            if oNewMember.idTestCase in dNew:
                raise TMRowAlreadyExists(
                    'Duplicate test group member: idTestCase=%d (%s / %s)' % (
                        oNewMember.idTestCase,
                        oNewMember,
                        dNew[oNewMember.idTestCase],
                    ))
            dNew[oNewMember.idTestCase] = oNewMember

            oOldMember = dOld.get(oNewMember.idTestCase, None)
            if oOldMember is not None:
                if oNewMember.isEqualEx(
                        oOldMember, ['uidAuthor', 'tsEffective', 'tsExpire']):
                    continue
                    # Skip, nothing changed.
                self._historizeTestGroupMember(oData.idTestGroup,
                                               oNewMember.idTestCase)
            self._insertTestGroupMember(uidAuthor, oNewMember)

        # Expire members that have been removed.
        sQuery = self._oDb.formatBindArgs(
            'UPDATE TestGroupMembers\n'
            'SET    tsExpire    = CURRENT_TIMESTAMP\n'
            'WHERE  idTestGroup = %s\n'
            '   AND tsExpire    = \'infinity\'::TIMESTAMP\n',
            (oData.idTestGroup, ))
        if dNew:
            sQuery += '   AND idTestCase NOT IN (%s)' % (', '.join(
                [str(iKey) for iKey in dNew]), )
        self._oDb.execute(sQuery)

        self._oDb.maybeCommit(fCommit)
        return True