Ejemplo n.º 1
0
 def test_getBuilders_masterid(self):
     yield self.insertTestData([
         fakedb.Builder(id=7, name='some:builder'),
         fakedb.Builder(id=8, name='other:builder'),
         fakedb.Builder(id=9, name='third:builder'),
         fakedb.Master(id=3, name='m1'),
         fakedb.Master(id=4, name='m2'),
         fakedb.BuilderMaster(builderid=7, masterid=3),
         fakedb.BuilderMaster(builderid=8, masterid=3),
         fakedb.BuilderMaster(builderid=8, masterid=4),
     ])
     builderlist = yield self.db.builders.getBuilders(masterid=3)
     for builderdict in builderlist:
         validation.verifyDbDict(self, 'builderdict', builderdict)
     self.assertEqual(
         sorted(builderlist, key=builderKey),
         sorted([
             dict(id=7,
                  name='some:builder',
                  masterids=[3],
                  tags=[],
                  description=None),
             dict(id=8,
                  name='other:builder',
                  masterids=[3, 4],
                  tags=[],
                  description=None),
         ],
                key=builderKey))
Ejemplo n.º 2
0
 def test_getWorker_multiple_connections(self):
     yield self.insertTestData(self.baseRows + [
         # the worker is connected to two masters at once.
         # weird, but the DB should represent it.
         fakedb.Worker(id=32, name='two'),
         fakedb.ConnectedWorker(workerid=32, masterid=10),
         fakedb.ConnectedWorker(workerid=32, masterid=11),
         fakedb.BuilderMaster(id=24, builderid=20, masterid=10),
         fakedb.BuilderMaster(id=25, builderid=20, masterid=11),
         fakedb.ConfiguredWorker(workerid=32, buildermasterid=24),
         fakedb.ConfiguredWorker(workerid=32, buildermasterid=25),
     ])
     workerdict = yield self.db.workers.getWorker(workerid=32)
     validation.verifyDbDict(self, 'workerdict', workerdict)
     self.assertEqual(
         workerdict,
         dict(id=32,
              name='two',
              workerinfo={'a': 'b'},
              paused=False,
              graceful=False,
              connected_to=[10, 11],
              configured_on=[
                  {
                      'builderid': 20,
                      'masterid': 10
                  },
                  {
                      'builderid': 20,
                      'masterid': 11
                  },
              ]))
Ejemplo n.º 3
0
 def test_getBuilder_with_masters(self):
     yield self.insertTestData([
         fakedb.Builder(id=7, name='some:builder'),
         fakedb.Master(id=3, name='m1'),
         fakedb.Master(id=4, name='m2'),
         fakedb.BuilderMaster(builderid=7, masterid=3),
         fakedb.BuilderMaster(builderid=7, masterid=4),
     ])
     builderdict = yield self.db.builders.getBuilder(7)
     validation.verifyDbDict(self, 'builderdict', builderdict)
     self.assertEqual(builderdict,
                      dict(id=7, name='some:builder', tags=[],
                           masterids=[3, 4], description=None))
Ejemplo n.º 4
0
 def test_removeBuilderMaster(self):
     yield self.insertTestData([
         fakedb.Builder(id=7),
         fakedb.Master(id=9, name='some:master'),
         fakedb.Master(id=10, name='other:master'),
         fakedb.BuilderMaster(builderid=7, masterid=9),
         fakedb.BuilderMaster(builderid=7, masterid=10),
     ])
     yield self.db.builders.removeBuilderMaster(builderid=7, masterid=9)
     builderdict = yield self.db.builders.getBuilder(7)
     validation.verifyDbDict(self, 'builderdict', builderdict)
     self.assertEqual(builderdict,
                      dict(id=7, name='some:builder', tags=[],
                           masterids=[10], description=None))
Ejemplo n.º 5
0
 def setup_multi_builders(self):
     # Make first builder configured, but not connected
     # Make second builder configured and connected
     self.master.db.insertTestData([
         fakedb.Worker(id=1, name='linux1', info={}),  # connected one
         fakedb.Worker(id=2, name='linux2', info={}),  # disconnected one
         fakedb.BuilderMaster(id=4012,
                              masterid=13,
                              builderid=self.BUILDER_IDS[0]),
         fakedb.BuilderMaster(id=4013,
                              masterid=13,
                              builderid=self.BUILDER_IDS[1]),
         fakedb.ConfiguredWorker(id=14013, workerid=2,
                                 buildermasterid=4012),
         fakedb.ConfiguredWorker(id=14013, workerid=1,
                                 buildermasterid=4013),
     ])
Ejemplo n.º 6
0
 def setUp(self):
     self.setUpEndpoint()
     return self.db.insertTestData([
         fakedb.Builder(id=1, name='buildera'),
         fakedb.Builder(id=2, name='builderb'),
         fakedb.Master(id=13),
         fakedb.BuilderMaster(id=1, builderid=2, masterid=13),
     ])
Ejemplo n.º 7
0
 def setUp(self):
     self.setUpEndpoint()
     self.master.name = "myname"
     self.db.insertTestData([
         fakedb.Master(id=13, name='some:master', active=False,
                       last_active=SOMETIME),
         fakedb.Master(id=14, name='other:master', active=True,
                       last_active=OTHERTIME),
         fakedb.Builder(id=22),
         fakedb.BuilderMaster(masterid=13, builderid=22),
     ])
Ejemplo n.º 8
0
 def setUp(self):
     self.setUpEndpoint()
     self.master.name = "myname"
     self.db.insertTestData([
         fakedb.Master(id=13, name='some:master', active=False,
                       last_active=SOMETIME),
         fakedb.Master(id=14, name='other:master', active=False,
                       last_active=SOMETIME),
         fakedb.Builder(id=23, name='bldr1'),
         fakedb.BuilderMaster(builderid=23, masterid=13),
         fakedb.Builder(id=24, name='bldr2'),
     ])
Ejemplo n.º 9
0
 def test_addBuilderMaster_already_present(self):
     yield self.insertTestData([
         fakedb.Builder(id=7),
         fakedb.Master(id=9, name='abc'),
         fakedb.Master(id=10, name='def'),
         fakedb.BuilderMaster(builderid=7, masterid=9),
     ])
     yield self.db.builders.addBuilderMaster(builderid=7, masterid=9)
     builderdict = yield self.db.builders.getBuilder(7)
     validation.verifyDbDict(self, 'builderdict', builderdict)
     self.assertEqual(builderdict,
                      dict(id=7, name='some:builder', tags=[],
                           masterids=[9], description=None))
Ejemplo n.º 10
0
 def setUp(self):
     self.setUpEndpoint()
     return self.db.insertTestData([
         fakedb.Builder(id=1, name='buildera'),
         fakedb.Builder(id=2, name='builderb'),
         fakedb.Builder(id=3, name='builderTagA'),
         fakedb.Builder(id=4, name='builderTagB'),
         fakedb.Builder(id=5, name='builderTagAB'),
         fakedb.Tag(id=3, name="tagA"),
         fakedb.Tag(id=4, name="tagB"),
         fakedb.BuildersTags(builderid=3, tagid=3),
         fakedb.BuildersTags(builderid=4, tagid=4),
         fakedb.BuildersTags(builderid=5, tagid=3),
         fakedb.BuildersTags(builderid=5, tagid=4),
         fakedb.Master(id=13),
         fakedb.BuilderMaster(id=1, builderid=2, masterid=13),
     ])
Ejemplo n.º 11
0
    def test_workerConfiguredMany(self):
        manyWorkers = [
            fakedb.BuilderMaster(id=1000, builderid=20, masterid=10),
        ] + [
            fakedb.Worker(id=50 + n, name='zero' + str(n)) for n in range(1000)
        ] + [
            fakedb.ConfiguredWorker(
                id=n + 3000, workerid=50 + n, buildermasterid=1000)
            for n in range(1000)
        ]
        yield self.insertTestData(self.baseRows + manyWorkers)

        # should successfully remove all ConfiguredWorker rows
        with self.assertNoMaxVariables():
            yield self.db.workers.deconfigureAllWorkersForMaster(masterid=10)

        w = yield self.db.workers.getWorker(30)
        self.assertEqual(sorted(w['configured_on']), [])
Ejemplo n.º 12
0
 def test_getWorker_not_connected(self):
     yield self.insertTestData(self.baseRows + [
         fakedb.BuilderMaster(id=12, builderid=20, masterid=10),
         fakedb.ConfiguredWorker(workerid=30, buildermasterid=12),
     ])
     workerdict = yield self.db.workers.getWorker(workerid=30)
     validation.verifyDbDict(self, 'workerdict', workerdict)
     self.assertEqual(
         workerdict,
         dict(id=30,
              name='zero',
              workerinfo={'a': 'b'},
              paused=False,
              graceful=False,
              configured_on=[{
                  'masterid': 10,
                  'builderid': 20
              }],
              connected_to=[]))
Ejemplo n.º 13
0
    def test_reconfigService_builder(self):
        old = yield self.createWorker('bot', 'pass')
        yield self.do_test_reconfigService(old, old)

        # initial configuration, there is no builder configured
        self.assertEqual(old._configured_builderid_list, [])
        workers = yield self.master.data.get(('workers',))
        self.assertEqual(len(workers[0]['configured_on']), 0)

        new = yield self.createWorker('bot', 'pass', configured=False)

        # we create a fake builder, and associate to the master
        self.botmaster.builders['bot'] = [FakeBuilder()]
        self.master.db.insertTestData([
            fakedb.Builder(id=1, name='builder'),
            fakedb.BuilderMaster(builderid=1, masterid=824)
        ])
        # on reconfig, the db should see the builder configured for this worker
        yield old.reconfigServiceWithSibling(new)
        self.assertEqual(old._configured_builderid_list, [1])
        workers = yield self.master.data.get(('workers',))
        self.assertEqual(len(workers[0]['configured_on']), 1)
        self.assertEqual(workers[0]['configured_on'][0]['builderid'], 1)
Ejemplo n.º 14
0
from buildbot.data import exceptions
from buildbot.data import resultspec
from buildbot.data import workers
from buildbot.test import fakedb
from buildbot.test.fake import fakemaster
from buildbot.test.util import endpoint
from buildbot.test.util import interfaces
from buildbot.test.util.misc import TestReactorMixin

testData = [
    fakedb.Builder(id=40, name='b1'),
    fakedb.Builder(id=41, name='b2'),
    fakedb.Master(id=13),
    fakedb.Master(id=14),
    fakedb.BuilderMaster(id=4013, builderid=40, masterid=13),
    fakedb.BuilderMaster(id=4014, builderid=40, masterid=14),
    fakedb.BuilderMaster(id=4113, builderid=41, masterid=13),

    fakedb.Worker(id=1, name='linux', info={}),
    fakedb.ConfiguredWorker(id=14013,
                            workerid=1, buildermasterid=4013),
    fakedb.ConfiguredWorker(id=14014,
                            workerid=1, buildermasterid=4014),
    fakedb.ConnectedWorker(id=113, masterid=13, workerid=1),

    fakedb.Worker(id=2, name='windows', info={"a": "b"}),
    fakedb.ConfiguredWorker(id=24013,
                            workerid=2, buildermasterid=4013),
    fakedb.ConfiguredWorker(id=24014,
                            workerid=2, buildermasterid=4014),
Ejemplo n.º 15
0
class Tests(interfaces.InterfaceTests):

    # common sample data

    baseRows = [
        fakedb.Master(id=10, name='m10'),
        fakedb.Master(id=11, name='m11'),
        fakedb.Builder(id=20, name='a'),
        fakedb.Builder(id=21, name='b'),
        fakedb.Builder(id=22, name='c'),
        fakedb.Worker(id=30, name='zero'),
        fakedb.Worker(id=31, name='one'),
    ]

    multipleMasters = [
        fakedb.BuilderMaster(id=12, builderid=20, masterid=10),
        fakedb.BuilderMaster(id=13, builderid=21, masterid=10),
        fakedb.BuilderMaster(id=14, builderid=20, masterid=11),
        fakedb.BuilderMaster(id=15, builderid=22, masterid=11),
        fakedb.BuilderMaster(id=16, builderid=22, masterid=10),
        fakedb.ConfiguredWorker(id=3012, workerid=30, buildermasterid=12),
        fakedb.ConfiguredWorker(id=3013, workerid=30, buildermasterid=13),
        fakedb.ConfiguredWorker(id=3014, workerid=30, buildermasterid=14),
        fakedb.ConfiguredWorker(id=3114, workerid=31, buildermasterid=14),
        fakedb.ConfiguredWorker(id=3115, workerid=31, buildermasterid=15),
        fakedb.ConnectedWorker(id=3010, workerid=30, masterid=10),
        fakedb.ConnectedWorker(id=3111, workerid=31, masterid=11),
    ]

    # sample worker data, with id's avoiding the postgres id sequence

    BOGUS_NAME = 'bogus'

    W1_NAME, W1_ID, W1_INFO = 'w1', 100, {'a': 1}
    worker1_rows = [
        fakedb.Worker(id=W1_ID, name=W1_NAME, info=W1_INFO),
    ]

    W2_NAME, W2_ID, W2_INFO = 'w2', 200, {'a': 1, 'b': 2}
    worker2_rows = [
        fakedb.Worker(id=W2_ID, name=W2_NAME, info=W2_INFO),
    ]

    # tests

    def test_signature_findWorkerId(self):
        @self.assertArgSpecMatches(self.db.workers.findWorkerId)
        def findWorkerId(self, name):
            pass

    def test_signature_getWorker(self):
        @self.assertArgSpecMatches(self.db.workers.getWorker)
        def getWorker(self,
                      workerid=None,
                      name=None,
                      masterid=None,
                      builderid=None):
            pass

    def test_signature_getWorkers(self):
        @self.assertArgSpecMatches(self.db.workers.getWorkers)
        def getWorkers(self,
                       masterid=None,
                       builderid=None,
                       paused=None,
                       graceful=None):
            pass

    def test_signature_workerConnected(self):
        @self.assertArgSpecMatches(self.db.workers.workerConnected)
        def workerConnected(self, workerid, masterid, workerinfo):
            pass

    def test_signature_workerDisconnected(self):
        @self.assertArgSpecMatches(self.db.workers.workerDisconnected)
        def workerDisconnected(self, workerid, masterid):
            pass

    def test_signature_workerConfigured(self):
        @self.assertArgSpecMatches(self.db.workers.workerConfigured)
        def workerConfigured(self, workerid, masterid, builderids):
            pass

    def test_signature_deconfigureAllWorkersForMaster(self):
        @self.assertArgSpecMatches(
            self.db.workers.deconfigureAllWorkersForMaster)
        def deconfigureAllWorkersForMaster(self, masterid):
            pass

    def test_signature_setWorkerState(self):
        @self.assertArgSpecMatches(self.db.workers.setWorkerState)
        def setWorkerState(self, workerid, paused, graceful):
            pass

    @defer.inlineCallbacks
    def test_findWorkerId_insert(self):
        id = yield self.db.workers.findWorkerId(name="xyz")
        worker = yield self.db.workers.getWorker(workerid=id)
        self.assertEqual(worker['name'], 'xyz')
        self.assertEqual(worker['workerinfo'], {})

    @defer.inlineCallbacks
    def test_findWorkerId_existing(self):
        yield self.insertTestData(self.baseRows)
        id = yield self.db.workers.findWorkerId(name="one")
        self.assertEqual(id, 31)

    @defer.inlineCallbacks
    def test_getWorker_no_such(self):
        yield self.insertTestData(self.baseRows)
        workerdict = yield self.db.workers.getWorker(workerid=99)
        self.assertEqual(workerdict, None)

    @defer.inlineCallbacks
    def test_getWorker_by_name_no_such(self):
        yield self.insertTestData(self.baseRows)
        workerdict = yield self.db.workers.getWorker(name='NOSUCH')
        self.assertEqual(workerdict, None)

    @defer.inlineCallbacks
    def test_getWorker_not_configured(self):
        yield self.insertTestData(self.baseRows)
        workerdict = yield self.db.workers.getWorker(workerid=30)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 connected_to=[],
                 configured_on=[]))

    @defer.inlineCallbacks
    def test_getWorker_connected_not_configured(self):
        yield self.insertTestData(self.baseRows + [
            # the worker is connected to this master, but not configured.
            # weird, but the DB should represent it.
            fakedb.Worker(id=32, name='two'),
            fakedb.ConnectedWorker(workerid=32, masterid=11),
        ])
        workerdict = yield self.db.workers.getWorker(workerid=32)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=32,
                 name='two',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 connected_to=[11],
                 configured_on=[]))

    @defer.inlineCallbacks
    def test_getWorker_multiple_connections(self):
        yield self.insertTestData(self.baseRows + [
            # the worker is connected to two masters at once.
            # weird, but the DB should represent it.
            fakedb.Worker(id=32, name='two'),
            fakedb.ConnectedWorker(workerid=32, masterid=10),
            fakedb.ConnectedWorker(workerid=32, masterid=11),
            fakedb.BuilderMaster(id=24, builderid=20, masterid=10),
            fakedb.BuilderMaster(id=25, builderid=20, masterid=11),
            fakedb.ConfiguredWorker(workerid=32, buildermasterid=24),
            fakedb.ConfiguredWorker(workerid=32, buildermasterid=25),
        ])
        workerdict = yield self.db.workers.getWorker(workerid=32)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=32,
                 name='two',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 connected_to=[10, 11],
                 configured_on=[
                     {
                         'builderid': 20,
                         'masterid': 10
                     },
                     {
                         'builderid': 20,
                         'masterid': 11
                     },
                 ]))

    @defer.inlineCallbacks
    def test_getWorker_by_name_not_configured(self):
        yield self.insertTestData(self.baseRows)
        workerdict = yield self.db.workers.getWorker(name='zero')
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 connected_to=[],
                 configured_on=[]))

    @defer.inlineCallbacks
    def test_getWorker_not_connected(self):
        yield self.insertTestData(self.baseRows + [
            fakedb.BuilderMaster(id=12, builderid=20, masterid=10),
            fakedb.ConfiguredWorker(workerid=30, buildermasterid=12),
        ])
        workerdict = yield self.db.workers.getWorker(workerid=30)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=[{
                     'masterid': 10,
                     'builderid': 20
                 }],
                 connected_to=[]))

    @defer.inlineCallbacks
    def test_getWorker_connected(self):
        yield self.insertTestData(self.baseRows + [
            fakedb.BuilderMaster(id=12, builderid=20, masterid=10),
            fakedb.ConfiguredWorker(workerid=30, buildermasterid=12),
            fakedb.ConnectedWorker(workerid=30, masterid=10),
        ])
        workerdict = yield self.db.workers.getWorker(workerid=30)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=[{
                     'masterid': 10,
                     'builderid': 20
                 }],
                 connected_to=[10]))

    @defer.inlineCallbacks
    def test_getWorker_with_multiple_masters(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdict = yield self.db.workers.getWorker(workerid=30)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                             key=configuredOnKey)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=sorted([
                     {
                         'masterid': 10,
                         'builderid': 20
                     },
                     {
                         'masterid': 10,
                         'builderid': 21
                     },
                     {
                         'masterid': 11,
                         'builderid': 20
                     },
                 ],
                                      key=configuredOnKey),
                 connected_to=[10]))

    @defer.inlineCallbacks
    def test_getWorker_with_multiple_masters_builderid(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdict = yield self.db.workers.getWorker(workerid=30, builderid=20)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                             key=configuredOnKey)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=sorted([
                     {
                         'masterid': 10,
                         'builderid': 20
                     },
                     {
                         'masterid': 11,
                         'builderid': 20
                     },
                 ],
                                      key=configuredOnKey),
                 connected_to=[10]))

    @defer.inlineCallbacks
    def test_getWorker_with_multiple_masters_masterid(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdict = yield self.db.workers.getWorker(workerid=30, masterid=11)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=[
                     {
                         'masterid': 11,
                         'builderid': 20
                     },
                 ],
                 connected_to=[]))

    @defer.inlineCallbacks
    def test_getWorker_with_multiple_masters_builderid_masterid(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdict = yield self.db.workers.getWorker(workerid=30,
                                                     builderid=20,
                                                     masterid=11)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=[
                     {
                         'masterid': 11,
                         'builderid': 20
                     },
                 ],
                 connected_to=[]))

    @defer.inlineCallbacks
    def test_getWorker_by_name_with_multiple_masters_builderid_masterid(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdict = yield self.db.workers.getWorker(name='zero',
                                                     builderid=20,
                                                     masterid=11)
        validation.verifyDbDict(self, 'workerdict', workerdict)
        self.assertEqual(
            workerdict,
            dict(id=30,
                 name='zero',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=False,
                 configured_on=[
                     {
                         'masterid': 11,
                         'builderid': 20
                     },
                 ],
                 connected_to=[]))

    @defer.inlineCallbacks
    def test_getWorkers_no_config(self):
        yield self.insertTestData(self.baseRows)
        workerdicts = yield self.db.workers.getWorkers()
        [
            validation.verifyDbDict(self, 'workerdict', workerdict)
            for workerdict in workerdicts
        ]
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=30,
                     name='zero',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=[],
                     connected_to=[]),
                dict(id=31,
                     name='one',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=[],
                     connected_to=[]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_with_config(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers()
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=30,
                     name='zero',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 10,
                             'builderid': 20
                         },
                         {
                             'masterid': 10,
                             'builderid': 21
                         },
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[10]),
                dict(id=31,
                     name='one',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                         {
                             'masterid': 11,
                             'builderid': 22
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[11]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_empty(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers(masterid=11,
                                                       builderid=21)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(sorted(workerdicts, key=workerKey), [])

    @defer.inlineCallbacks
    def test_getWorkers_with_config_builderid(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers(builderid=20)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=30,
                     name='zero',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 10,
                             'builderid': 20
                         },
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[10]),
                dict(id=31,
                     name='one',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[11]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_with_config_masterid_10(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers(masterid=10)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=30,
                     name='zero',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 10,
                             'builderid': 20
                         },
                         {
                             'masterid': 10,
                             'builderid': 21
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[10]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_with_config_masterid_11(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers(masterid=11)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=30,
                     name='zero',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[]),
                dict(id=31,
                     name='one',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 11,
                             'builderid': 20
                         },
                         {
                             'masterid': 11,
                             'builderid': 22
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[11]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_with_config_masterid_11_builderid_22(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        workerdicts = yield self.db.workers.getWorkers(masterid=11,
                                                       builderid=22)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = sorted(workerdict['configured_on'],
                                                 key=configuredOnKey)
        self.assertEqual(
            sorted(workerdicts, key=workerKey),
            sorted([
                dict(id=31,
                     name='one',
                     workerinfo={'a': 'b'},
                     paused=False,
                     graceful=False,
                     configured_on=sorted([
                         {
                             'masterid': 11,
                             'builderid': 22
                         },
                     ],
                                          key=configuredOnKey),
                     connected_to=[11]),
            ],
                   key=workerKey))

    @defer.inlineCallbacks
    def test_getWorkers_with_paused(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        yield self.db.workers.setWorkerState(31, paused=True, graceful=False)
        workerdicts = yield self.db.workers.getWorkers(paused=True)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = []
        self.assertEqual(workerdicts, [
            dict(id=31,
                 name='one',
                 workerinfo={'a': 'b'},
                 paused=True,
                 graceful=False,
                 configured_on=[],
                 connected_to=[11]),
        ])

    @defer.inlineCallbacks
    def test_getWorkers_with_graceful(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)
        yield self.db.workers.setWorkerState(31, paused=False, graceful=True)
        workerdicts = yield self.db.workers.getWorkers(graceful=True)
        for workerdict in workerdicts:
            validation.verifyDbDict(self, 'workerdict', workerdict)
            workerdict['configured_on'] = []
        self.assertEqual(workerdicts, [
            dict(id=31,
                 name='one',
                 workerinfo={'a': 'b'},
                 paused=False,
                 graceful=True,
                 configured_on=[],
                 connected_to=[11]),
        ])

    @defer.inlineCallbacks
    def test_workerConnected_existing(self):
        yield self.insertTestData(self.baseRows + self.worker1_rows)

        NEW_INFO = {'other': [1, 2, 3]}

        yield self.db.workers.workerConnected(workerid=self.W1_ID,
                                              masterid=11,
                                              workerinfo=NEW_INFO)

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(
            w, {
                'id': self.W1_ID,
                'name': self.W1_NAME,
                'workerinfo': NEW_INFO,
                'paused': False,
                'graceful': False,
                'configured_on': [],
                'connected_to': [11]
            })

    @defer.inlineCallbacks
    def test_workerConnected_already_connected(self):
        yield self.insertTestData(self.baseRows + self.worker1_rows + [
            fakedb.ConnectedWorker(id=888, workerid=self.W1_ID, masterid=11),
        ])
        yield self.db.workers.workerConnected(workerid=self.W1_ID,
                                              masterid=11,
                                              workerinfo={})

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(w['connected_to'], [11])

    @defer.inlineCallbacks
    def test_workerDisconnected(self):
        yield self.insertTestData(self.baseRows + self.worker1_rows + [
            fakedb.ConnectedWorker(id=888, workerid=self.W1_ID, masterid=10),
            fakedb.ConnectedWorker(id=889, workerid=self.W1_ID, masterid=11),
        ])
        yield self.db.workers.workerDisconnected(workerid=self.W1_ID,
                                                 masterid=11)

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(w['connected_to'], [10])

    @defer.inlineCallbacks
    def test_workerDisconnected_already_disconnected(self):
        yield self.insertTestData(self.baseRows + self.worker1_rows)
        yield self.db.workers.workerDisconnected(workerid=self.W1_ID,
                                                 masterid=11)

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(w['connected_to'], [])

    @defer.inlineCallbacks
    def test_setWorkerState_existing(self):
        yield self.insertTestData(self.baseRows + self.worker1_rows)

        yield self.db.workers.setWorkerState(workerid=self.W1_ID,
                                             paused=False,
                                             graceful=True)

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(
            w, {
                'id': self.W1_ID,
                'name': self.W1_NAME,
                'workerinfo': self.W1_INFO,
                'paused': False,
                'graceful': True,
                'configured_on': [],
                'connected_to': []
            })

        yield self.db.workers.setWorkerState(workerid=self.W1_ID,
                                             paused=True,
                                             graceful=False)

        w = yield self.db.workers.getWorker(self.W1_ID)
        self.assertEqual(
            w, {
                'id': self.W1_ID,
                'name': self.W1_NAME,
                'workerinfo': self.W1_INFO,
                'paused': True,
                'graceful': False,
                'configured_on': [],
                'connected_to': []
            })

    @defer.inlineCallbacks
    def test_workerConfigured(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove builder 21, and add 22
        yield self.db.workers.deconfigureAllWorkersForMaster(masterid=10)

        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[20, 22])

        w = yield self.db.workers.getWorker(30)
        self.assertEqual(
            sorted(w['configured_on'], key=configuredOnKey),
            sorted([{
                'builderid': 20,
                'masterid': 11
            }, {
                'builderid': 20,
                'masterid': 10
            }, {
                'builderid': 22,
                'masterid': 10
            }],
                   key=configuredOnKey))

    @defer.inlineCallbacks
    def test_workerConfiguredTwice(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove builder 21, and add 22
        yield self.db.workers.deconfigureAllWorkersForMaster(masterid=10)

        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[20, 22])

        # configure again (should eat the duplicate insertion errors)
        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[20, 21, 22])

        w = yield self.db.workers.getWorker(30)
        x1 = sorted(w['configured_on'], key=configuredOnKey)
        x2 = sorted([{
            'builderid': 20,
            'masterid': 11
        }, {
            'builderid': 20,
            'masterid': 10
        }, {
            'builderid': 21,
            'masterid': 10
        }, {
            'builderid': 22,
            'masterid': 10
        }],
                    key=configuredOnKey)
        self.assertEqual(x1, x2)

    @defer.inlineCallbacks
    def test_workerReConfigured(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove builder 21, and add 22
        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[20, 22])

        w = yield self.db.workers.getWorker(30)
        w['configured_on'] = sorted(w['configured_on'], key=configuredOnKey)
        self.assertEqual(
            w['configured_on'],
            sorted([{
                'builderid': 20,
                'masterid': 11
            }, {
                'builderid': 20,
                'masterid': 10
            }, {
                'builderid': 22,
                'masterid': 10
            }],
                   key=configuredOnKey))

    @defer.inlineCallbacks
    def test_workerReConfigured_should_not_affect_other_worker(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove all the builders in master 11
        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=11,
                                               builderids=[])

        w = yield self.db.workers.getWorker(30)
        x1 = sorted(w['configured_on'], key=configuredOnKey)
        x2 = sorted([{
            'builderid': 20,
            'masterid': 10
        }, {
            'builderid': 21,
            'masterid': 10
        }],
                    key=configuredOnKey)
        self.assertEqual(x1, x2)

        # ensure worker 31 is not affected (see GitHub issue#3392)
        w = yield self.db.workers.getWorker(31)
        x1 = sorted(w['configured_on'], key=configuredOnKey)
        x2 = sorted([{
            'builderid': 20,
            'masterid': 11
        }, {
            'builderid': 22,
            'masterid': 11
        }],
                    key=configuredOnKey)
        self.assertEqual(x1, x2)

    @defer.inlineCallbacks
    def test_workerUnconfigured(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove all builders from master 10
        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[])

        w = yield self.db.workers.getWorker(30)
        w['configured_on'] = sorted(w['configured_on'], key=configuredOnKey)
        expected = sorted([{
            'builderid': 20,
            'masterid': 11
        }],
                          key=configuredOnKey)
        self.assertEqual(w['configured_on'], expected)

    @defer.inlineCallbacks
    def test_nothingConfigured(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        # should remove builder 21, and add 22
        yield self.db.workers.deconfigureAllWorkersForMaster(masterid=10)
        yield self.db.workers.workerConfigured(workerid=30,
                                               masterid=10,
                                               builderids=[])

        # should only keep builder for master 11
        w = yield self.db.workers.getWorker(30)
        self.assertEqual(sorted(w['configured_on']),
                         sorted([{
                             'builderid': 20,
                             'masterid': 11
                         }]))

    @defer.inlineCallbacks
    def test_deconfiguredAllWorkers(self):
        yield self.insertTestData(self.baseRows + self.multipleMasters)

        res = yield self.db.workers.getWorkers(masterid=11)
        self.assertEqual(len(res), 2)

        # should remove all worker configured for masterid 11
        yield self.db.workers.deconfigureAllWorkersForMaster(masterid=11)

        res = yield self.db.workers.getWorkers(masterid=11)
        self.assertEqual(len(res), 0)
Ejemplo n.º 16
0
 def insert_initial_data(self):
     self.master.db.insertTestData([
         fakedb.Master(id=1),
         fakedb.Worker(id=1, name='example-worker'),
         fakedb.Scheduler(id=1, name='custom', enabled=1),
         fakedb.Scheduler(id=2, name='all', enabled=2),
         fakedb.Scheduler(id=3, name='force', enabled=3),
         fakedb.SchedulerMaster(schedulerid=1, masterid=1),
         fakedb.SchedulerMaster(schedulerid=2, masterid=1),
         fakedb.SchedulerMaster(schedulerid=3, masterid=1),
         fakedb.Builder(id=1, name='runtests1'),
         fakedb.Builder(id=2, name='runtests2'),
         fakedb.Builder(id=3, name='runtests3'),
         fakedb.BuilderMaster(id=1, builderid=1, masterid=1),
         fakedb.BuilderMaster(id=2, builderid=2, masterid=1),
         fakedb.BuilderMaster(id=3, builderid=3, masterid=1),
         fakedb.Tag(id=1, name='tag1'),
         fakedb.Tag(id=2, name='tag12'),
         fakedb.Tag(id=3, name='tag23'),
         fakedb.BuildersTags(id=1, builderid=1, tagid=1),
         fakedb.BuildersTags(id=2, builderid=1, tagid=2),
         fakedb.BuildersTags(id=3, builderid=2, tagid=2),
         fakedb.BuildersTags(id=4, builderid=2, tagid=3),
         fakedb.BuildersTags(id=5, builderid=3, tagid=3),
         fakedb.Buildset(id=1,
                         results=SUCCESS,
                         reason="Force reason 1",
                         submitted_at=100000,
                         complete_at=100110,
                         complete=1),
         fakedb.Buildset(id=2,
                         results=SUCCESS,
                         reason="Force reason 2",
                         submitted_at=100200,
                         complete_at=100330,
                         complete=1),
         fakedb.Buildset(id=3,
                         results=SUCCESS,
                         reason="Force reason 3",
                         submitted_at=100400,
                         complete_at=100550,
                         complete=1),
         fakedb.BuildsetProperty(buildsetid=1,
                                 property_name='scheduler',
                                 property_value='["custom", "Scheduler"]'),
         fakedb.BuildsetProperty(buildsetid=2,
                                 property_name='scheduler',
                                 property_value='["all", "Scheduler"]'),
         fakedb.BuildsetProperty(buildsetid=3,
                                 property_name='scheduler',
                                 property_value='["force", "Scheduler"]'),
         fakedb.BuildsetProperty(
             buildsetid=3,
             property_name='owner',
             property_value='["*****@*****.**", "Force Build Form"]'),
         fakedb.SourceStamp(id=1, branch='master', revision='1234abcd'),
         fakedb.Change(changeid=1,
                       branch='master',
                       revision='1234abcd',
                       sourcestampid=1),
         fakedb.ChangeProperty(
             changeid=1,
             property_name="owner",
             property_value='["*****@*****.**", "change"]'),
         fakedb.ChangeProperty(changeid=1,
                               property_name="other_prop",
                               property_value='["value", "change"]'),
         fakedb.BuildsetSourceStamp(id=1, buildsetid=1, sourcestampid=1),
         fakedb.BuildsetSourceStamp(id=2, buildsetid=2, sourcestampid=1),
         fakedb.BuildsetSourceStamp(id=3, buildsetid=3, sourcestampid=1),
         fakedb.BuildRequest(id=1,
                             buildsetid=1,
                             builderid=1,
                             results=SUCCESS,
                             submitted_at=100001,
                             complete_at=100109,
                             complete=1),
         fakedb.BuildRequest(id=2,
                             buildsetid=2,
                             builderid=1,
                             results=SUCCESS,
                             submitted_at=100201,
                             complete_at=100329,
                             complete=1),
         fakedb.BuildRequest(id=3,
                             buildsetid=3,
                             builderid=2,
                             results=SUCCESS,
                             submitted_at=100401,
                             complete_at=100549,
                             complete=1),
         fakedb.Build(id=1,
                      number=1,
                      buildrequestid=1,
                      builderid=1,
                      workerid=1,
                      masterid=1001,
                      started_at=100002,
                      complete_at=100108,
                      state_string='build successful',
                      results=SUCCESS),
         fakedb.Build(id=2,
                      number=2,
                      buildrequestid=2,
                      builderid=1,
                      workerid=1,
                      masterid=1001,
                      started_at=100202,
                      complete_at=100328,
                      state_string='build successful',
                      results=SUCCESS),
         fakedb.Build(id=3,
                      number=1,
                      buildrequestid=3,
                      builderid=2,
                      workerid=1,
                      masterid=1001,
                      started_at=100402,
                      complete_at=100548,
                      state_string='build successful',
                      results=SUCCESS),
         fakedb.BuildProperty(buildid=3,
                              name='reason',
                              value='"force build"',
                              source="Force Build Form"),
         fakedb.BuildProperty(buildid=3,
                              name='owner',
                              value='"*****@*****.**"',
                              source="Force Build Form"),
         fakedb.BuildProperty(buildid=3,
                              name='scheduler',
                              value='"force"',
                              source="Scheduler"),
         fakedb.BuildProperty(buildid=3,
                              name='buildername',
                              value='"runtests3"',
                              source="Builder"),
         fakedb.BuildProperty(buildid=3,
                              name='workername',
                              value='"example-worker"',
                              source="Worker"),
         fakedb.Step(id=1,
                     number=1,
                     name='step1',
                     buildid=1,
                     started_at=100010,
                     complete_at=100019,
                     state_string='step1 done'),
         fakedb.Step(id=2,
                     number=2,
                     name='step2',
                     buildid=1,
                     started_at=100020,
                     complete_at=100029,
                     state_string='step2 done'),
         fakedb.Step(id=3,
                     number=3,
                     name='step3',
                     buildid=1,
                     started_at=100030,
                     complete_at=100039,
                     state_string='step3 done'),
         fakedb.Step(id=11,
                     number=1,
                     name='step1',
                     buildid=2,
                     started_at=100210,
                     complete_at=100219,
                     state_string='step1 done'),
         fakedb.Step(id=12,
                     number=2,
                     name='step2',
                     buildid=2,
                     started_at=100220,
                     complete_at=100229,
                     state_string='step2 done'),
         fakedb.Step(id=13,
                     number=3,
                     name='step3',
                     buildid=2,
                     started_at=100230,
                     complete_at=100239,
                     state_string='step3 done'),
         fakedb.Step(id=21,
                     number=1,
                     name='step1',
                     buildid=3,
                     started_at=100410,
                     complete_at=100419,
                     state_string='step1 done'),
         fakedb.Step(id=22,
                     number=2,
                     name='step2',
                     buildid=3,
                     started_at=100420,
                     complete_at=100429,
                     state_string='step2 done'),
         fakedb.Step(id=23,
                     number=3,
                     name='step3',
                     buildid=3,
                     started_at=100430,
                     complete_at=100439,
                     state_string='step3 done'),
         fakedb.Log(id=1,
                    name='stdio',
                    slug='stdio',
                    stepid=1,
                    complete=1,
                    num_lines=10),
         fakedb.Log(id=2,
                    name='stdio',
                    slug='stdio',
                    stepid=2,
                    complete=1,
                    num_lines=20),
         fakedb.Log(id=3,
                    name='stdio',
                    slug='stdio',
                    stepid=3,
                    complete=1,
                    num_lines=30),
         fakedb.Log(id=11,
                    name='stdio',
                    slug='stdio',
                    stepid=11,
                    complete=1,
                    num_lines=30),
         fakedb.Log(id=12,
                    name='stdio',
                    slug='stdio',
                    stepid=12,
                    complete=1,
                    num_lines=40),
         fakedb.Log(id=13,
                    name='stdio',
                    slug='stdio',
                    stepid=13,
                    complete=1,
                    num_lines=50),
         fakedb.Log(id=21,
                    name='stdio',
                    slug='stdio',
                    stepid=21,
                    complete=1,
                    num_lines=50),
         fakedb.Log(id=22,
                    name='stdio',
                    slug='stdio',
                    stepid=22,
                    complete=1,
                    num_lines=60),
         fakedb.Log(id=23,
                    name='stdio',
                    slug='stdio',
                    stepid=23,
                    complete=1,
                    num_lines=70),
         fakedb.LogChunk(logid=1,
                         first_line=0,
                         last_line=2,
                         content='o line1\no line2\n'),
         fakedb.LogChunk(logid=1,
                         first_line=2,
                         last_line=3,
                         content='o line3\n'),
         fakedb.LogChunk(logid=2,
                         first_line=0,
                         last_line=4,
                         content='o line1\no line2\no line3\no line4\n'),
     ])