示例#1
0
    def setUp(self):
        self.setUpBuilderMixin()

        # a collection of rows that would otherwise clutter up every test
        master_id = fakedb.FakeBuildRequestsComponent.MASTER_ID
        self.base_rows = [
            fakedb.SourceStamp(id=21),
            fakedb.Buildset(id=11, reason='because'),
            fakedb.BuildsetSourceStamp(buildsetid=11, sourcestampid=21),
            fakedb.Builder(id=77, name='bldr1'),
            fakedb.Builder(id=78, name='bldr2'),
            fakedb.Builder(id=182, name='foo@bar'),
            fakedb.BuildRequest(id=111, submitted_at=1000,
                                builderid=77, buildsetid=11),
            fakedb.BuildRequest(id=222, submitted_at=2000,
                                builderid=77, buildsetid=11),
            fakedb.BuildRequestClaim(brid=222, masterid=master_id,
                                     claimed_at=2001),
            fakedb.BuildRequest(id=333, submitted_at=3000,
                                builderid=77, buildsetid=11),
            fakedb.BuildRequest(id=444, submitted_at=2500,
                                builderid=78, buildsetid=11),
            fakedb.BuildRequestClaim(brid=444, masterid=master_id,
                                     claimed_at=2501),
            fakedb.BuildRequest(id=555, submitted_at=2800,
                                builderid=182, buildsetid=11),
        ]
        yield self.db.insertTestData(self.base_rows)
示例#2
0
 def setUp(self):
     # a collection of rows that would otherwise clutter up every test
     master_id = fakedb.FakeBuildRequestsComponent.MASTER_ID
     self.base_rows = [
         fakedb.SourceStampSet(id=21),
         fakedb.SourceStamp(id=21, sourcestampsetid=21),
         fakedb.Buildset(id=11, reason='because', sourcestampsetid=21),
         fakedb.BuildRequest(id=111,
                             submitted_at=1000,
                             buildername='bldr1',
                             buildsetid=11),
         fakedb.BuildRequest(id=222,
                             submitted_at=2000,
                             buildername='bldr1',
                             buildsetid=11),
         fakedb.BuildRequestClaim(brid=222,
                                  objectid=master_id,
                                  claimed_at=2001),
         fakedb.BuildRequest(id=333,
                             submitted_at=3000,
                             buildername='bldr1',
                             buildsetid=11),
         fakedb.BuildRequest(id=444,
                             submitted_at=2500,
                             buildername='bldr2',
                             buildsetid=11),
         fakedb.BuildRequestClaim(brid=444,
                                  objectid=master_id,
                                  claimed_at=2501),
     ]
示例#3
0
    def test_reclaimBuildRequests_fail(self):
        d = self.do_test_reclaimBuildRequests(
            [
                fakedb.BuildRequest(id=44, buildsetid=self.BSID),
                fakedb.BuildRequestClaim(
                    brid=44, objectid=self.MASTER_ID, claimed_at=1300103810),
                fakedb.BuildRequest(id=45, buildsetid=self.BSID),
                fakedb.BuildRequestClaim(brid=45,
                                         objectid=self.OTHER_MASTER_ID,
                                         claimed_at=1300103810),
            ],
            1300305712, [44, 45],
            expfailure=buildrequests.AlreadyClaimedError)

        def check(_):
            # check that the time wasn't updated on 44, noting that MySQL does
            # not support this.
            if self.db_engine.dialect.name == 'mysql':
                return

            def thd(conn):
                tbl = self.db.model.buildrequest_claims
                q = tbl.select(order_by=tbl.c.brid)
                results = conn.execute(q).fetchall()
                self.assertEqual([(r.brid, r.claimed_at, r.objectid)
                                  for r in results], [
                                      (44, 1300103810, self.MASTER_ID),
                                      (45, 1300103810, self.OTHER_MASTER_ID),
                                  ])

            return self.db.pool.do(thd)

        d.addCallback(check)
        return d
示例#4
0
    def do_test_getBuildRequests_claim_args(self, **kwargs):
        expected = kwargs.pop('expected')
        d = self.insertTestData([
            # 50: claimed by this master
            fakedb.BuildRequest(id=50, buildsetid=self.BSID),
            fakedb.BuildRequestClaim(brid=50,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 51: claimed by another master
            fakedb.BuildRequest(id=51, buildsetid=self.BSID),
            fakedb.BuildRequestClaim(brid=51,
                                     objectid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 52: unclaimed
            fakedb.BuildRequest(id=52, buildsetid=self.BSID),

            # 53: unclaimed but complete (should not appear for claimed=False)
            fakedb.BuildRequest(id=53, buildsetid=self.BSID, complete=1),
        ])
        d.addCallback(
            lambda _: self.db.buildrequests.getBuildRequests(**kwargs))

        def check(brlist):
            self.assertEqual(sorted([br['brid'] for br in brlist]),
                             sorted(expected))

        d.addCallback(check)
        return d
    def do_test_getBuildRequests_claim_args(self, **kwargs):
        expected = kwargs.pop('expected')
        yield self.insertTestData([
            # 50: claimed by this master
            fakedb.BuildRequest(id=50,
                                buildsetid=self.BSID,
                                builderid=self.BLDRID1),
            fakedb.BuildRequestClaim(brid=50,
                                     masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 51: claimed by another master
            fakedb.BuildRequest(id=51,
                                buildsetid=self.BSID,
                                builderid=self.BLDRID2),
            fakedb.BuildRequestClaim(brid=51,
                                     masterid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 52: unclaimed
            fakedb.BuildRequest(id=52,
                                buildsetid=self.BSID,
                                builderid=self.BLDRID1),

            # 53: unclaimed but complete (should not appear for claimed=False)
            fakedb.BuildRequest(id=53,
                                buildsetid=self.BSID,
                                builderid=self.BLDRID1,
                                complete=1),
        ])
        brlist = yield self.db.buildrequests.getBuildRequests(**kwargs)

        self.assertEqual(sorted([br['buildrequestid'] for br in brlist]),
                         sorted(expected))
示例#6
0
    def test_reclaimBuildRequests_fail(self):
        d = self.do_test_reclaimBuildRequests(
            [
                fakedb.BuildRequest(id=44, buildsetid=self.BSID),
                fakedb.BuildRequestClaim(
                    brid=44, masterid=self.MASTER_ID, claimed_at=1300103810),
                fakedb.BuildRequest(id=45, buildsetid=self.BSID),
                fakedb.BuildRequestClaim(brid=45,
                                         masterid=self.OTHER_MASTER_ID,
                                         claimed_at=1300103810),
            ],
            1300305712, [44, 45],
            expfailure=buildrequests.AlreadyClaimedError)

        # check that the time wasn't updated on 44, noting that MySQL does
        # not support this.
        if self.db_engine.dialect.name == 'mysql':
            return d

        d.addCallback(lambda _: self.db.buildrequests.getBuildRequests())

        def check(results):
            self.assertEqual(
                sorted((r['buildrequestid'], r['claimed_at'],
                        r['claimed_by_masterid']) for r in results),
                [
                    (44, epoch2datetime(1300103810), self.MASTER_ID),
                    (45, epoch2datetime(1300103810), self.OTHER_MASTER_ID),
                ])

        d.addCallback(check)
        return d
class TestMastersConfigConnectorComponent(
            connector_component.ConnectorComponentMixin,
            unittest.TestCase):


    def setUp(self):
        d = self.setUpConnectorComponent(
            table_names=['mastersconfig', 'objects',
                         'buildrequest_claims', 'buildrequests'])

        def finish_setup(_):
            self.db.mastersconfig = mastersconfig.MastersConfigConnectorComponent(self.db)
        d.addCallback(finish_setup)

        return d

    def tearDown(self):
        return self.tearDownConnectorComponent()

    # common sample data

    background_data = [
        fakedb.Object(id=1, name='katana/buildmaster-01', class_name='buildbot.master.BuildMaster'),
        fakedb.Object(id=2, name='katana/buildmaster-02', class_name='buildbot.master.BuildMaster'),
        fakedb.MasterConfig(id=1, buildbotURL='http://localhost:8001/', objectid=1),
        fakedb.MasterConfig(id=2, buildbotURL='http://localhost:8002/', objectid=2),
        fakedb.BuildRequest(id=1, buildsetid=1, buildername='b1'),
        fakedb.BuildRequest(id=2, buildsetid=2, buildername='b1'),
        fakedb.BuildRequestClaim(brid=1, objectid=1, claimed_at='1416383733'),
        fakedb.BuildRequestClaim(brid=2, objectid=2, claimed_at='1416383733'),
    ]

    def test_setupMaster(self):
        d = self.db.mastersconfig.setupMaster('http://localhost:8001/', 1)
        def check(_):
            def thd(conn):
                r = conn.execute(self.db.model.mastersconfig.select())
                rows = [(row.id, row.buildbotURL, row.objectid)
                         for row in r.fetchall()]
                self.assertEqual(rows,
                    [(1, 'http://localhost:8001/', 1)])
            return self.db.pool.do(thd)
        d.addCallback(check)
        return d

    def test_getMasterURL(self):
        d = self.insertTestData(self.background_data)

        def check(row, expected_master={}):
            self.assertEqual(row, expected_master)

        d.addCallback(lambda _ : self.db.mastersconfig.getMasterURL(1))
        d.addCallback(check, expected_master={'buildbotURL': 'http://localhost:8001/',
                                              'id': 1, 'objectid': 1})
        d.addCallback(lambda _ : self.db.mastersconfig.getMasterURL(2))
        d.addCallback(check, expected_master={'buildbotURL': 'http://localhost:8002/',
                                              'id': 2, 'objectid': 2})

        return d
    def test_getBuildRequests_combo(self):
        d = self.insertTestData([
            # 44: everything we want
            fakedb.BuildRequest(id=44, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=1, results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 45: different builderid
            fakedb.BuildRequest(id=45, buildsetid=self.BSID, builderid=self.BLDRID2,
                                complete=1,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=45, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 46: incomplete
            fakedb.BuildRequest(id=46, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, results=92,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=46, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 47: unclaimed
            fakedb.BuildRequest(id=47, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=1, results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),

            # 48: claimed by other
            fakedb.BuildRequest(id=48, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=1, results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=48, masterid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 49: different bsid
            fakedb.Buildset(id=self.BSID + 1),
            fakedb.BuildRequest(id=49, buildsetid=self.BSID + 1,
                                builderid=self.BLDRID1, complete=1, results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=49, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),
        ])
        d.addCallback(lambda _:
                      self.db.buildrequests.getBuildRequests(builderid=self.BLDRID1,
                                                             claimed=self.MASTER_ID,
                                                             complete=True, bsid=self.BSID))

        @d.addCallback
        def check(brlist):
            self.assertEqual([br['buildrequestid'] for br in brlist], [44])
        return d
    def test_getBuildRequest(self):
        d = self.insertTestData([
            fakedb.BuildRequest(id=44,
                                buildsetid=self.BSID,
                                builderid=self.BLDRID1,
                                complete=1,
                                results=75,
                                priority=7,
                                submitted_at=self.SUBMITTED_AT_EPOCH,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44,
                                     masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),
        ])
        d.addCallback(lambda _: self.db.buildrequests.getBuildRequest(44))

        @d.addCallback
        def check(brdict):
            self.assertEqual(
                brdict,
                dict(buildrequestid=44,
                     buildsetid=self.BSID,
                     builderid=self.BLDRID1,
                     buildername="builder1",
                     priority=7,
                     claimed=True,
                     claimed_by_masterid=self.MASTER_ID,
                     complete=True,
                     results=75,
                     claimed_at=self.CLAIMED_AT,
                     submitted_at=self.SUBMITTED_AT,
                     complete_at=self.COMPLETE_AT,
                     waited_for=False))

        return d
示例#10
0
    def test_getBuildRequest(self):
        d = self.insertTestData([
            fakedb.BuildRequest(id=44,
                                buildsetid=self.BSID,
                                buildername="bbb",
                                complete=1,
                                results=75,
                                priority=7,
                                submitted_at=self.SUBMITTED_AT_EPOCH,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),
        ])
        d.addCallback(lambda _: self.db.buildrequests.getBuildRequest(44))

        def check(brdict):
            self.assertEqual(
                brdict,
                dict(brid=44,
                     buildsetid=self.BSID,
                     buildername="bbb",
                     priority=7,
                     claimed=True,
                     mine=True,
                     complete=True,
                     results=75,
                     claimed_at=self.CLAIMED_AT,
                     submitted_at=self.SUBMITTED_AT,
                     complete_at=self.COMPLETE_AT))

        d.addCallback(check)
        return d
 def test_completeBuildRequests(self):
     return self.do_test_completeBuildRequests([
         fakedb.BuildRequest(
             id=44, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(
             brid=44, masterid=self.MASTER_ID, claimed_at=1300103810),
     ], 1300305712, [(44, True, 7, epoch2datetime(1300305712))])
示例#12
0
    def test_claimBuildRequests_other_master_claim_stress(self):
        d = self.do_test_claimBuildRequests(
            [
                fakedb.BuildRequest(id=id, buildsetid=self.BSID)
                for id in range(1, 1000)
            ] + [
                fakedb.BuildRequest(id=1000, buildsetid=self.BSID),
                # the fly in the ointment..
                fakedb.BuildRequestClaim(brid=1000,
                                         objectid=self.OTHER_MASTER_ID,
                                         claimed_at=1300103810),
            ],
            1300305712,
            range(1, 1001),
            expfailure=buildrequests.AlreadyClaimedError)

        def check(_):
            # check that [1,1000) were not claimed, and 1000 is still claimed
            def thd(conn):
                tbl = self.db.model.buildrequest_claims
                q = tbl.select()
                results = conn.execute(q).fetchall()
                self.assertEqual([(r.brid, r.objectid, r.claimed_at)
                                  for r in results][:10],
                                 [(1000, self.OTHER_MASTER_ID, 1300103810)])

            return self.db.pool.do(thd)

        d.addCallback(check)
        return d
    def test_claimBuildRequests_other_master_claim_stress(self):
        d = self.do_test_claimBuildRequests(
            [
                fakedb.BuildRequest(
                    id=id, buildsetid=self.BSID, builderid=self.BLDRID1)
                for id in range(1, 1000)
            ] + [
                fakedb.BuildRequest(
                    id=1000, buildsetid=self.BSID, builderid=self.BLDRID1),
                # the fly in the ointment..
                fakedb.BuildRequestClaim(brid=1000,
                                         masterid=self.OTHER_MASTER_ID,
                                         claimed_at=1300103810),
            ],
            1300305712,
            lrange(1, 1001),
            expfailure=buildrequests.AlreadyClaimedError)
        d.addCallback(
            lambda _: self.db.buildrequests.getBuildRequests(claimed=True))

        @d.addCallback
        def check(results):
            # check that [1,1000) were not claimed, and 1000 is still claimed
            self.assertEqual([
                (r['buildrequestid'], r['claimed_by_masterid'],
                 r['claimed_at']) for r in results
            ][:10], [(1000, self.OTHER_MASTER_ID, epoch2datetime(1300103810))])

        return d
    def do_test_unclaimMethod(self, method, expected):
        d = self.insertTestData([
            # 44: a complete build (should not be unclaimed)
            fakedb.BuildRequest(id=44, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=1, results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 45: incomplete build belonging to this incarnation
            fakedb.BuildRequest(id=45, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, complete_at=0),
            fakedb.BuildRequestClaim(brid=45, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 46: incomplete build belonging to another master
            fakedb.BuildRequest(id=46, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, complete_at=0),
            fakedb.BuildRequestClaim(brid=46, masterid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 47: unclaimed
            fakedb.BuildRequest(id=47, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, complete_at=0),

            # 48: claimed by this master, but recently
            fakedb.BuildRequest(id=48, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, complete_at=0),
            fakedb.BuildRequestClaim(brid=48, masterid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH - 50),

            # 49: incomplete old build belonging to another master
            fakedb.BuildRequest(id=49, buildsetid=self.BSID, builderid=self.BLDRID1,
                                complete=0, complete_at=0),
            fakedb.BuildRequestClaim(brid=49, masterid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH - 1000),
        ])
        d.addCallback(lambda _: method())
        # just select the unclaimed requests
        d.addCallback(lambda _:
                      self.db.buildrequests.getBuildRequests(claimed=False))

        @d.addCallback
        def check(results):
            self.assertEqual(sorted([r['buildrequestid'] for r in results]),
                             sorted(expected))
        return d
示例#15
0
        def trigger_sch(sourcestamps = None, set_props=None, triggeredbybrid=None, reason=None):
            rows = [ fakedb.MasterConfig(id=1,  buildbotURL="build-master-01/", objectid=1),
                     fakedb.MasterConfig(id=2, buildbotURL="build-master-02/", objectid=2),
                     fakedb.SourceStampSet(id=1),
                     fakedb.SourceStamp(id=1, sourcestampsetid=1, codebase='c',
                                        branch="az", repository="xz", revision="ww"),
                     fakedb.Buildset(id=1, reason='because', sourcestampsetid=1),
                     fakedb.BuildRequest(id=1, buildsetid=1, buildername="builder1", submitted_at=130000),
                     fakedb.BuildRequest(id=2, buildsetid=1, buildername="builder2", submitted_at=130000),
                     fakedb.BuildRequestClaim(brid=1, objectid=2, claimed_at=130000),
                     fakedb.BuildRequestClaim(brid=2, objectid=1, claimed_at=130000),
                     fakedb.Build(id=1, number=1, brid=1),
                     fakedb.Build(id=2, number=1, brid=2)]

            d = m.db.insertTestData(rows)
            d.addCallback(lambda _: (SUCCESS,  {'builder1': 1L, 'builder2': 2L}))
            return d
 def test_claimBuildRequests_other_master_claim(self):
     return self.do_test_claimBuildRequests([
         fakedb.BuildRequest(
             id=44, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=44,
                                  masterid=self.OTHER_MASTER_ID,
                                  claimed_at=1300103810),
     ], 1300305712, [44],
         expfailure=buildrequests.AlreadyClaimedError)
 def test_reclaimBuildRequests(self):
     return self.do_test_reclaimBuildRequests([
         fakedb.BuildRequest(
             id=44, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID,
                                  claimed_at=1300103810),
     ], 1300305712, [44],
         # note that the time is updated
         [(44, epoch2datetime(1300305712), self.MASTER_ID)])
示例#18
0
 def test_completeBuildRequests_explicit_time(self):
     return self.do_test_completeBuildRequests(
         [
             fakedb.BuildRequest(id=44, buildsetid=self.BSID),
             fakedb.BuildRequestClaim(
                 brid=44, objectid=self.MASTER_ID, claimed_at=1300103810),
         ],
         1300305712, [(44, True, 7, epoch2datetime(999999))],
         complete_at=epoch2datetime(999999))
示例#19
0
 def test_completeBuildRequests_multiple(self):
     return self.do_test_completeBuildRequests([
         fakedb.BuildRequest(id=44, buildsetid=self.BSID),
         fakedb.BuildRequestClaim(
             brid=44, objectid=self.MASTER_ID, claimed_at=1300103810),
         fakedb.BuildRequest(id=45, buildsetid=self.BSID),
         fakedb.BuildRequestClaim(
             brid=45, objectid=self.OTHER_MASTER_ID, claimed_at=1300103811),
         fakedb.BuildRequest(id=46, buildsetid=self.BSID),
         fakedb.BuildRequestClaim(
             brid=46, objectid=self.MASTER_ID, claimed_at=1300103812),
     ],
                                               1300305712, [
                                                   (44, 1, 7, 1300305712),
                                                   (45, 0, -1, 0),
                                                   (46, 1, 7, 1300305712),
                                               ],
                                               brids=[44, 46])
 def test_completeBuildRequests_multiple(self):
     return self.do_test_completeBuildRequests([
         fakedb.BuildRequest(
             id=44, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID,
                                  claimed_at=1300103810),
         fakedb.BuildRequest(
             id=45, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=45, masterid=self.OTHER_MASTER_ID,
                                  claimed_at=1300103811),
         fakedb.BuildRequest(
             id=46, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=46, masterid=self.MASTER_ID,
                                  claimed_at=1300103812),
     ], 1300305712,
         [(44, True, 7, epoch2datetime(1300305712)),
          (45, False, -1, None),
          (46, True, 7, epoch2datetime(1300305712)),
          ], brids=[44, 46])
示例#21
0
 def test_reclaimBuildRequests(self):
     return self.do_test_reclaimBuildRequests(
         [
             fakedb.BuildRequest(id=44, buildsetid=self.BSID),
             fakedb.BuildRequestClaim(
                 brid=44, objectid=self.MASTER_ID, claimed_at=1300103810),
         ],
         1300305712,
         [44],
         # note that the time is updated
         [(44, 1300305712, self.MASTER_ID)])
示例#22
0
    def test_masterDeactivated(self):
        self.master.db.insertTestData([
            fakedb.Master(id=14, name='other', active=0,
                          last_active=0),

            # set up a running build with some steps
            fakedb.Builder(id=77, name='b1'),
            fakedb.Worker(id=13, name='wrk'),
            fakedb.Buildset(id=8822),
            fakedb.BuildRequest(id=82, builderid=77, buildsetid=8822),
            fakedb.BuildRequestClaim(brid=82, masterid=14,
                                     claimed_at=SOMETIME),
            fakedb.Build(id=13, builderid=77, masterid=14, workerid=13,
                         buildrequestid=82, number=3, results=None),
            fakedb.Step(id=200, buildid=13),
            fakedb.Log(id=2000, stepid=200, num_lines=2),
            fakedb.LogChunk(logid=2000, first_line=1, last_line=2,
                            content=u'ab\ncd')
        ])

        # mock out the _masterDeactivated methods this will call
        for rtype in 'builder', 'scheduler', 'changesource':
            rtype_obj = getattr(self.master.data.rtypes, rtype)
            m = mock.Mock(name='%s._masterDeactivated' % rtype,
                          spec=rtype_obj._masterDeactivated)
            m.side_effect = lambda masterid: defer.succeed(None)
            rtype_obj._masterDeactivated = m

        # and the update methods..
        for meth in 'finishBuild', 'finishStep', 'finishLog':
            m = mock.create_autospec(getattr(self.master.data.updates, meth))
            m.side_effect = lambda *args, **kwargs: defer.succeed(None)
            setattr(self.master.data.updates, meth, m)

        yield self.rtype._masterDeactivated(14, 'other')

        self.master.data.rtypes.builder._masterDeactivated. \
            assert_called_with(masterid=14)
        self.master.data.rtypes.scheduler._masterDeactivated. \
            assert_called_with(masterid=14)
        self.master.data.rtypes.changesource._masterDeactivated. \
            assert_called_with(masterid=14)

        # see that we finished off that build and its steps and logs
        updates = self.master.data.updates
        updates.finishLog.assert_called_with(logid=2000)
        updates.finishStep.assert_called_with(
            stepid=200, results=RETRY, hidden=False)
        updates.finishBuild.assert_called_with(buildid=13, results=RETRY)

        self.assertEqual(self.master.mq.productions, [
            (('masters', '14', 'stopped'),
             dict(masterid=14, name='other', active=False)),
        ])
示例#23
0
 def test_completeBuildRequests_stress(self):
     return self.do_test_completeBuildRequests(
         [
             fakedb.BuildRequest(id=id, buildsetid=self.BSID)
             for id in range(1, 280)
         ] + [
             fakedb.BuildRequestClaim(
                 brid=id, objectid=self.MASTER_ID, claimed_at=1300103810)
             for id in range(1, 280)
         ],
         1300305712, [(id, True, 7, epoch2datetime(1300305712))
                      for id in range(1, 280)],
         brids=range(1, 280))
 def test_completeBuildRequests_multiple_notmine(self):
     # note that the requests are completed even though they are not mine!
     return self.do_test_completeBuildRequests([
         # two unclaimed requests
         fakedb.BuildRequest(
             id=44, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequest(
             id=45, buildsetid=self.BSID, builderid=self.BLDRID1),
         # and one claimed by another master
         fakedb.BuildRequest(
             id=46, buildsetid=self.BSID, builderid=self.BLDRID1),
         fakedb.BuildRequestClaim(brid=46, masterid=self.OTHER_MASTER_ID,
                                  claimed_at=1300103812),
     ], 1300305712,
         [(44, True, 7, epoch2datetime(1300305712)),
          (45, True, 7, epoch2datetime(1300305712)),
          (46, True, 7, epoch2datetime(1300305712)), ],
         brids=[44, 45, 46])
示例#25
0
 def test_completeBuildRequests_multiple_notmine(self):
     # note that the requests are completed even though they are not mine!
     return self.do_test_completeBuildRequests(
         [
             # two unclaimed requests
             fakedb.BuildRequest(id=44, buildsetid=self.BSID),
             fakedb.BuildRequest(id=45, buildsetid=self.BSID),
             # and one claimed by another master
             fakedb.BuildRequest(id=46, buildsetid=self.BSID),
             fakedb.BuildRequestClaim(brid=46,
                                      objectid=self.MASTER_ID + 1100,
                                      claimed_at=1300103812),
         ],
         1300305712,
         [
             (44, 1, 7, 1300305712),
             (45, 1, 7, 1300305712),
             (46, 1, 7, 1300305712),
         ],
         brids=[44, 45, 46])
示例#26
0
    def do_test_unclaimMethod(self, method, expected):
        d = self.insertTestData([
            # 44: a complete build (should not be unclaimed)
            fakedb.BuildRequest(id=44,
                                buildsetid=self.BSID,
                                complete=1,
                                results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 45: incomplete build belonging to this incarnation
            fakedb.BuildRequest(id=45,
                                buildsetid=self.BSID,
                                complete=0,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=45,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 46: incomplete build belonging to another master
            fakedb.BuildRequest(id=46,
                                buildsetid=self.BSID,
                                complete=0,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=46,
                                     objectid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 47: unclaimed
            fakedb.BuildRequest(id=47,
                                buildsetid=self.BSID,
                                complete=0,
                                complete_at=0),

            # 48: claimed by this master, but recently
            fakedb.BuildRequest(id=48,
                                buildsetid=self.BSID,
                                complete=0,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=48,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH - 50),

            # 49: incomplete old build belonging to another master
            fakedb.BuildRequest(id=49,
                                buildsetid=self.BSID,
                                complete=0,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=49,
                                     objectid=self.OTHER_MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH - 1000),
        ])
        d.addCallback(lambda _: method())

        def check(brlist):
            def thd(conn):
                # just select the unclaimed requests
                reqs_tbl = self.db.model.buildrequests
                claims_tbl = self.db.model.buildrequest_claims
                join = reqs_tbl.outerjoin(claims_tbl,
                                          reqs_tbl.c.id == claims_tbl.c.brid)
                q = sa.select([reqs_tbl.c.id],
                              from_obj=[join],
                              whereclause=claims_tbl.c.claimed_at == None)
                results = conn.execute(q).fetchall()
                self.assertEqual(sorted([r.id for r in results]),
                                 sorted(expected))

            return self.db.pool.do(thd)

        d.addCallback(check)
        return d
    def insertBuildrequests(self,
                            buildername,
                            priority,
                            xrange,
                            submitted_at=1449578391,
                            results=BEGINNING,
                            complete=0,
                            mergebrid=None,
                            artifactbrid=None,
                            startbrid=None,
                            selected_slave=None,
                            sources=None):
        self.testdata += [
            fakedb.BuildRequest(id=self.lastbrid + idx,
                                buildsetid=self.lastbrid + idx,
                                buildername=buildername,
                                priority=priority,
                                results=results,
                                complete=complete,
                                mergebrid=mergebrid,
                                artifactbrid=artifactbrid,
                                startbrid=startbrid,
                                submitted_at=submitted_at) for idx in xrange
        ]

        if results == RESUME:
            breqsclaim = [
                fakedb.BuildRequestClaim(brid=self.lastbrid + idx,
                                         objectid=self.MASTER_ID,
                                         claimed_at=1449578391)
                for idx in xrange
            ]
            self.testdata += breqsclaim

        if selected_slave:
            self.testdata += [
                fakedb.BuildsetProperty(
                    buildsetid=self.lastbrid + idx,
                    property_name='selected_slave',
                    property_value='["%s", "Force Build Form"]' %
                    selected_slave) for idx in xrange
            ]

        self.testdata += [
            fakedb.Buildset(id=self.lastbrid + idx,
                            sourcestampsetid=self.lastbrid + idx)
            for idx in xrange
        ]

        if not sources:
            self.testdata += [
                fakedb.SourceStamp(sourcestampsetid=self.lastbrid + idx,
                                   branch='branch_%d' % (self.lastbrid + idx))
                for idx in xrange
            ]

        else:
            self.testdata += [
                fakedb.SourceStampSet(id=self.lastbrid + idx) for idx in xrange
            ]
            for ss in sources:
                self.testdata += [
                    fakedb.SourceStamp(sourcestampsetid=self.lastbrid + idx,
                                       repository=ss['repository'],
                                       codebase=ss['codebase'],
                                       branch=ss['branch'],
                                       revision=ss['revision'])
                    for idx in xrange
                ]

        self.lastbrid += len(xrange)
示例#28
0
    def test_getBuildRequests_combo(self):
        d = self.insertTestData([
            # 44: everything we want
            fakedb.BuildRequest(id=44,
                                buildsetid=self.BSID,
                                buildername="bbb",
                                complete=1,
                                results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=44,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 45: different buildername
            fakedb.BuildRequest(id=45,
                                buildsetid=self.BSID,
                                buildername="ccc",
                                complete=1,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=45,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 46: incomplete
            fakedb.BuildRequest(id=46,
                                buildsetid=self.BSID,
                                buildername="bbb",
                                complete=0,
                                results=92,
                                complete_at=0),
            fakedb.BuildRequestClaim(brid=46,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 47: unclaimed
            fakedb.BuildRequest(id=47,
                                buildsetid=self.BSID,
                                buildername="bbb",
                                complete=1,
                                results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),

            # 48: claimed by other
            fakedb.BuildRequest(id=48,
                                buildsetid=self.BSID,
                                buildername="bbb",
                                complete=1,
                                results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=48,
                                     objectid=self.MASTER_ID + 1100,
                                     claimed_at=self.CLAIMED_AT_EPOCH),

            # 49: different bsid
            fakedb.Buildset(id=self.BSID + 1, sourcestampid=234),
            fakedb.BuildRequest(id=49,
                                buildsetid=self.BSID + 1,
                                buildername="bbb",
                                complete=1,
                                results=92,
                                complete_at=self.COMPLETE_AT_EPOCH),
            fakedb.BuildRequestClaim(brid=49,
                                     objectid=self.MASTER_ID,
                                     claimed_at=self.CLAIMED_AT_EPOCH),
        ])
        d.addCallback(lambda _: self.db.buildrequests.getBuildRequests(
            buildername="bbb", claimed="mine", complete=True, bsid=self.BSID))

        def check(brlist):
            self.assertEqual([br['brid'] for br in brlist], [44])

        d.addCallback(check)
        return d
示例#29
0
 def test_completeBuildRequests(self):
     return self.do_test_completeBuildRequests([
         fakedb.BuildRequest(id=44, buildsetid=self.BSID),
         fakedb.BuildRequestClaim(
             brid=44, objectid=self.MASTER_ID, claimed_at=1300103810),
     ], 1300305712, [(44, 1, 7, 1300305712)])