Ejemplo n.º 1
0
 def testRestartWithLoadInstalled(self):
     simpleRecipe = 'loadInstalled("foo")\n' + recipes.simpleRecipe
     simpleSource = self.addComponent('simple:source=1-1',
                                      [('simple.recipe', simpleRecipe)])
     fooSource = self.addComponent('foo:source=1-1',
                                   [('foo.recipe', fooRecipe)])
     simpleRun = self.addComponent('simple:runtime=1-1-1')
     simpleColl = self.addCollection('simple=1-1-1', [':runtime'],
                                     loadedReqs=[(fooSource, 'ssl')])
     job = self.newJob(simpleSource)
     db = self.openRmakeDatabase()
     b = builder.Builder(self.rmakeCfg, job, [], db)
     b.initializeBuild()
     simpleBt = job.iterTroves().next()
     simpleBt.troveBuilt([
         simpleColl.getNameVersionFlavor(),
         simpleRun.getNameVersionFlavor()
     ])
     restartJob = self.getRestartJob(job)
     jobContext = [job.jobId]
     b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db)
     b.initializeBuild()
     trove = restartJob.iterTroves().next()
     assert (trove.isPrebuilt())
     assert (trove.superClassesMatch)
     fooSource = self.addComponent('foo:source=1-2',
                                   [('foo.recipe', fooRecipe)])
     restartJob = self.getRestartJob(job)
     jobContext = [job.jobId]
     b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db)
     b.initializeBuild()
     trove = restartJob.iterTroves().next()
     assert (trove.isPrebuilt())
     assert (not trove.superClassesMatch)
Ejemplo n.º 2
0
    def testLoad2LevelsDeep(self):
        myLoadedRecipe = loadedRecipe.replace('@@', '1')
        myLoadedRecipe = "loadSuperClass('loaded2')\n" + myLoadedRecipe
        loadedSrc = self.addComponent('loaded:source', ':branch/1',
                                      [('loaded.recipe', myLoadedRecipe)])
        self.addComponent('loaded:runtime', ':branch/1')
        loaded = self.addCollection('loaded', ':branch/1', ['loaded:runtime'])

        loaded2 = self.addComponent('loaded2:source', ':branch2/1',
                                    [('loaded2.recipe', loaded2Recipe)])
        loadInstalled = self.addComponent(
            'loadinstalled:source', '1',
            [('loadinstalled.recipe', loadInstalledRecipe)])
        buildCfg = copy.deepcopy(self.buildCfg)
        buildCfg.resolveTroveTups = [[
            loaded.getNameVersionFlavor(),
            loaded2.getNameVersionFlavor()
        ]]
        job = self.newJob(loadInstalled, buildConfig=buildCfg)
        b = builder.Builder(self.rmakeCfg, job)
        b.initializeBuild()
        buildTrove = job.iterTroves().next()
        assert (buildTrove.packages == set(['loadinstalled', 'loaded-1']))
        assert (buildTrove.getLoadedSpecs() == dict(
            loaded=(loadedSrc.getNameVersionFlavor(),
                    dict(loaded2=(loaded2.getNameVersionFlavor(), {})))))
        # make sure that the correct version are loaded using loadRecipeClass
        # normally using loadRecipeClass we'd just load out of the repository
        self.addComponent('loaded:source', '1',
                          [('loaded.recipe', myLoadedRecipe)])
        n, v, f = loadInstalled.getNameVersionFlavor()
        repos = self.openRepository()
        repos = self.openRmakeRepository()
        loader, recipeClass = recipeutil.loadRecipeClass(
            repos, n, v, f, overrides=buildTrove.getLoadedSpecs())[0:2]
        if hasattr(loader, 'getLoadedSpecs'):
            assert (loader.getLoadedSpecs().values()[0][0] ==
                    loadedSrc.getNameVersionFlavor())
        else:
            assert(recipeClass._loadedSpecs.values()[0][0] \
                    == loadedSrc.getNameVersionFlavor())

        # test that again, except for this time, make sure that cook
        # gets the same info - cook would never find these troves
        # without having it passed in from the outside.
        job = self.newJob(loadInstalled, buildConfig=buildCfg)
        b = builder.Builder(self.rmakeCfg, job)
        txt = self.captureOutput(b.build)[1]
        assert (b.job.isBuilt())
        buildTrove = b.job.iterTroves().next()
        builtTroves = repos.getTroves(
            [x for x in buildTrove.getBinaryTroves() if ':' not in x[0]])
        builtTroves = dict((x.getName(), x) for x in builtTroves)
        assert (set(builtTroves['loadinstalled'].getLoadedTroves()) == set(
            [loadedSrc.getNameVersionFlavor(),
             loaded2.getNameVersionFlavor()]))
Ejemplo n.º 3
0
    def testLoadInstalledFromBuildingTroves(self):
        # this loaded is in resolveTroveTups
        self.addComponent('loaded:runtime', ':branch/1')
        trv = self.addCollection('loaded', ':branch/1', ['loaded:runtime'])

        # we're building this one though - it wins.
        # We also need to see a build ordering here.
        loaded = self.addComponent(
            'loaded:source', ':branch2/2',
            [('loaded.recipe', loadedRecipe.replace('@@', '2'))])

        loadInstalled = self.addComponent(
            'loadinstalled:source', '1',
            [('loadinstalled.recipe', loadInstalledRecipe)])
        buildCfg = copy.deepcopy(self.buildCfg)
        buildCfg.resolveTroveTups = [[trv.getNameVersionFlavor()]]
        job = self.newJob(loadInstalled, loaded, buildConfig=buildCfg)
        b = builder.Builder(self.rmakeCfg, job)
        b.initializeBuild()
        buildTrove = [
            x for x in job.iterTroves()
            if x.getName() == 'loadinstalled:source'
        ][0]
        assert (buildTrove.packages == set(['loadinstalled', 'loaded-2']))
        resolveJob = b.dh.getNextResolveJob()
        assert (resolveJob.getTrove().getName() == 'loaded:source')
        assert (not b.dh.getNextResolveJob())
Ejemplo n.º 4
0
    def testBuildImages(self):
        rbuildServer = self.startMockRbuilder()
        oldSleep = time.sleep
        self.mock(time, 'sleep', lambda x: oldSleep(.1))
        self.addComponent('foo:run')
        trv = self.addCollection('group-foo', ['foo:run'])
        db = self.openRmakeDatabase()
        job = self.newJob()
        trv = self.newImageTrove(job.jobId, productName='product', imageType='imageType',
                                 imageOptions={},
                                 *trv.getNameVersionFlavor())
        trv.setConfig(self.buildCfg)
        job.addBuildTrove(trv)
        job.setBuildTroves([trv])
        b = builder.Builder(self.rmakeCfg, job)
        self.logFilter.add()
        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        try:
            b.build()
        except Exception:
            b.worker.stopAllCommands()
            raise
        log = db.getTroveBuildLog(1, job.troves.values()[0].getNameVersionFlavor(), 0)[1]
        expectedLog = '''\
0: Working: 51
0: Working: 101
0: Working: 151
0: Finished.
'''
        assert(expectedLog in log)
Ejemplo n.º 5
0
 def testPrebuiltBinaries(self):
     trv = self.addComponent('testcase:source', '1.0-1', '',
                             [('testcase.recipe', workingRecipe)])
     trv2 = self.addComponent('simple:source', '1.0-2',
                                [('simple.recipe', recipes.simpleRecipe)])
     binTrv = self.addCollection('testcase=1.0-1-1[ssl]', [':runtime'], 
                              createComps=True)
     binTrv2 = self.addCollection('testcase=1.0-1-1[!ssl]', [':runtime'], 
                                  createComps=True)
     binTrv3 = self.addCollection('testcase=1.0-1-1', [':runtime'], 
                              createComps=True)
     binTrv4 = self.addCollection('simple=1.0-1-1', [':runtime'])
     job = self.newJob(trv, trv2)
     prebuilt = [ x.getNameVersionFlavor() for x in 
                  (binTrv, binTrv2, binTrv3, binTrv4)]
     job.getMainConfig().prebuiltBinaries = prebuilt
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     for trv in job.iterTroves():
         if trv.getName().split(':')[0] in ['testcase']:
             assert(trv.isPrebuilt())
             assert(trv.prebuiltIsSourceMatch())
         else:
             assert(trv.isPrebuilt())
             assert(not trv.prebuiltIsSourceMatch())
     job = self.newJob(trv2)
     job.getMainConfig().prebuiltBinaries = prebuilt
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     for trv in job.iterTroves():
         assert(trv.isPrebuilt())
         assert(not trv.prebuiltIsSourceMatch())
     binTrv5 = self.addCollection('simple=1.0-2-1', [':runtime'],
                          loadedReqs=[binTrv.getNameVersionFlavor()])
     prebuilt.append(binTrv5.getNameVersionFlavor())
     job.getMainConfig().prebuiltBinaries = prebuilt
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     for trv in job.iterTroves():
         assert(trv.isPrebuilt())
         assert(not trv.prebuiltIsSourceMatch())
     job.getMainConfig().ignoreAllRebuildDeps = True
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     for trv in job.iterTroves():
         assert(trv.isPrebuilt())
Ejemplo n.º 6
0
    def testRestart(self):
        self.openRepository()
        self.openRmakeRepository()
        jobId = fixtures.addBuiltJob1(self)
        db = self.openRmakeDatabase()
        job = db.getJob(jobId)
        logPath = job.troves.values()[0].logPath
        jobContext = [jobId]
        restartJob = self.getRestartJob(job)
        b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db)
        b.initializeBuild()
        trove = restartJob.iterTroves().next()
        assert (trove.isPrebuilt())
        b.build()
        assert (restartJob.isBuilt())
        assert (trove.isBuilt())
        assert (logPath == restartJob.troves.values()[0].logPath)

        # update the source and make sure it needs a rebuild
        fixtures.updateBuiltJob1(self)
        restartJob = self.getRestartJob(job)
        b = builder.Builder(self.rmakeCfg, restartJob, jobContext, db)
        b.initializeBuild()
        trove = restartJob.iterTroves().next()
        assert (not trove.isPrebuilt())
        b.build()
        assert (restartJob.isBuilt())
        assert (trove.isBuilt())
        assert (logPath != restartJob.troves.values()[0].logPath)

        buildReqRun = self.addComponent('buildreq:runtime', '2', ['/buildreq'])
        buildReq = self.addCollection('buildreq', '2', [':runtime'])

        # now update build req - that should start out as prebuilt
        # but in the end it should create new binaries not existing before.
        jobContext = [restartJob.jobId]
        restartJob2 = self.getRestartJob(restartJob)
        b = builder.Builder(self.rmakeCfg, restartJob2, jobContext, db)
        b.initializeBuild()
        trove2 = restartJob2.iterTroves().next()
        assert (trove2.isPrebuilt())
        b.dh.updateBuildableTroves()
        assert (trove2.isBuildable())
Ejemplo n.º 7
0
    def testInfoRecipe(self):
        self.openRmakeRepository()
        db = self.openRmakeDatabase()
        trv = self.addComponent('info-sys:source', '1.0-1', '',
                                [('info-sys.recipe', infoRecipe)])
        troveList = [ trv.getNameVersionFlavor() ]
        job = self.newJob(*troveList)
        b = builder.Builder(self.rmakeCfg, job)

        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert(b.job.isBuilt())
Ejemplo n.º 8
0
 def testFilesetRecipe(self):
     self.openRmakeRepository()
     self.addComponent('orig:run', '1', ['/bin/foo'])
     self.addCollection('orig', '1', [':run'])
     trv = self.addComponent('fileset-foo:source', '1.0-1', '',
                             [('fileset-foo.recipe', filesetRecipe)])
     troveList = [ trv.getNameVersionFlavor() ]
     job = self.newJob(*troveList)
     b = builder.Builder(self.rmakeCfg, job)
     logFile = logfile.LogFile(self.workDir + '/buildlog')
     logFile.redirectOutput()
     b.build()
     logFile.restoreOutput()
     assert b.job.isBuilt(), b.job.troves.values()[0].getFailureReason()
Ejemplo n.º 9
0
    def testGroupRecipe(self):
        if compat.ConaryVersion().conaryVersion[0:2] == [1,2]:
            raise testhelp.SkipTestException('test fails on 1.2')
        repos = self.openRmakeRepository()
        db = self.openRmakeDatabase()

        self.buildCfg.shortenGroupFlavors = True
        self.buildCfg.setSection('foo') # add context foo
        self.buildCfg.configLine('buildFlavor desktop is:x86')
        self.buildCfg.setSection('bar') 
        self.buildCfg.configLine('buildFlavor !desktop is:x86')

        simple = self.addComponent('simple:runtime', '1.0-1-1', '')
        other1 = self.addComponent('other:runtime', '1.0-1-1', '!desktop',
                filePrimer=1)
        other2 = self.addComponent('other:runtime', '1.0-1-1', 'desktop',
                filePrimer=1)

        # Prevent the desktop flag from being pre-filtered out
        recipe = groupRecipe + '\n        if Use.desktop: pass\n'
        trv = self.addComponent('group-foo:source', 
                     '/localhost@rpl:linux//rmakehost@local:linux/1:1.0-1',
                     [('group-foo.recipe', recipe)])
        troveList = [
                trv.getNameVersionFlavor() + ('foo',),
                trv.getNameVersionFlavor() + ('bar',),
                ]
        job = self.newJob(*troveList)
        b = builder.Builder(self.rmakeCfg, job)

        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert b.job.isBuilt(), str(b.job.getFailureReason())
        assert len(b.job.getBuiltTroveList()) == 2, b.job.getBuiltTroveList()

        for tup in b.job.getBuiltTroveList():
            groupTrove = repos.getTrove(*tup)
            # this is just a very basic test of builder -> group build.
            # tests of the group cook code's ability to include the right 
            # version in particular cases should be in cooktest.py
            if '!desktop' in str(groupTrove.getFlavor()):
                other = other1
            else:
                other = other2
            self.assertEqual(sorted(groupTrove.iterTroveList(strongRefs=True)),
                    [other.getNameVersionFlavor(),
                        simple.getNameVersionFlavor()])
Ejemplo n.º 10
0
    def testMacrosRecipe(self):
        self.openRmakeRepository()
        db = self.openRmakeDatabase()
        trv = self.addComponent('testcase:source', '1.0-1', '',
                                [('testcase.recipe', macrosRecipe)])
        self.buildCfg.configLine('macros foo readline')
        self.buildCfg.macros['multi'] = 'line1\nline2'
        job = self.newJob(trv)
        b = builder.Builder(self.rmakeCfg, job)

        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert(b.job.isBuilt())
Ejemplo n.º 11
0
 def testLoadSuperClassMultipleFlavors(self):
     repos = self.openRepository()
     repos = self.openRmakeRepository()
     # load the same superclass with two different flavors
     self.addComponent('group-superclass:source', '1.0', '',
                       [('group-superclass.recipe', superClass)])
     main = self.addComponent('group-main:source', '1.0', '',
                              [('group-main.recipe', mainClass)])
     self.addComponent('foo:run', '1')
     mainSsl = (main.getName(), main.getVersion(), parseFlavor('ssl'))
     mainNoSsl = (main.getName(), main.getVersion(), parseFlavor('!ssl'))
     job = self.newJob(mainSsl, mainNoSsl)
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     txt = self.captureOutput(b.build)[1]
     assert b.job.isBuilt(), b.job.getFailureReason()
Ejemplo n.º 12
0
    def testLoadInstalledFromResolveTroves(self):
        self.addComponent('loaded:source', ':branch/1',
                          [('loaded.recipe', loadedRecipe.replace('@@', '1'))])
        self.addComponent('loaded:runtime', ':branch/1')
        trv = self.addCollection('loaded', ':branch/1', ['loaded:runtime'])

        loadInstalled = self.addComponent(
            'loadinstalled:source', '1',
            [('loadinstalled.recipe', loadInstalledRecipe)])
        buildCfg = copy.deepcopy(self.buildCfg)
        buildCfg.resolveTroveTups = [[trv.getNameVersionFlavor()]]
        job = self.newJob(loadInstalled, buildConfig=buildCfg)
        b = builder.Builder(self.rmakeCfg, job)
        b.initializeBuild()
        buildTrove = job.iterTroves().next()
        assert (buildTrove.packages == set(['loadinstalled', 'loaded-1']))
Ejemplo n.º 13
0
 def testLoadInstalledFallsBackToInstallLabelPath(self):
     # loaded is on the ILP, but loadInstalled:source doesn't mention
     # that label at all.
     self.addComponent('loaded:source', ':branch2/1',
                       [('loaded.recipe', loadedRecipe.replace('@@', '1'))])
     loadInstalled = self.addComponent(
         'loadinstalled:source', ':branch/1',
         [('loadinstalled.recipe', loadInstalledRecipe)])
     buildCfg = copy.deepcopy(self.buildCfg)
     buildCfg.resolveTroveTups = []
     buildCfg.installLabelPath.append(
         versions.Label('localhost@rpl:branch2'))
     job = self.newJob(loadInstalled, buildConfig=buildCfg)
     b = builder.Builder(self.rmakeCfg, job)
     b.initializeBuild()
     buildTrove = job.iterTroves().next()
     assert (buildTrove.packages == set(['loadinstalled', 'loaded-1']))
Ejemplo n.º 14
0
    def testPrebuiltGroups(self):
        """
        Groups should never be pre-built.

        @tests: RMK-903
        """
        self.addComponent('foo:runtime')
        groupSource = self.addComponent('group-foo:source=1.0-1',
            [('group-foo.recipe', groupRecipe)])
        groupTrove = self.addCollection('group-foo=1.0-1-1',
            ['foo:runtime'])

        job = self.newJob(groupSource)
        job.getMainConfig().prebuiltBinaries = [
            groupTrove.getNameVersionFlavor()]
        build = builder.Builder(self.rmakeCfg, job)
        build.initializeBuild()

        for buildTrove in job.iterTroves():
            self.failIf(buildTrove.isPrebuilt(), "Group trove is pre-built")
Ejemplo n.º 15
0
    def testRedirectRecipe(self):
        self.openRmakeRepository()
        db = self.openRmakeDatabase()
        self.addComponent('redirect:run', '1')
        self.addCollection('redirect', '1', [':run'])
        self.addComponent('target:run', '1')
        self.addCollection('target', '1', [':run'])
        # simulate building a checkout
        trv = self.addComponent(
         'redirect:source=/localhost@rpl:linux//rmakehost@local:linux/1.0-1', 
         [('redirect.recipe', redirectRecipe)])
        os.chdir(self.workDir)
        troveList = [ trv.getNameVersionFlavor() ]
        job = self.newJob(*troveList)
        b = builder.Builder(self.rmakeCfg, job)

        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert b.job.isBuilt(), b.job.getFailureReason()
Ejemplo n.º 16
0
    def testBasic(self):
        trv = self.addComponent('nocross:source', '1.0-1', '',
                                [('nocross.recipe', nocrossRecipe)])
        trv2 = self.addComponent('crosstool:source', '1.0-1', '',
                                 [('crosstool.recipe', crosstoolRecipe)])
        ccRoot = self.rmakeCfg.buildDir + '/chroots/crosscompiled'
        trv3 = self.addComponent(
            'crosscompiled:source', '1.0-1', '',
            [('crosscompiled.recipe', crosscompiledRecipe % (ccRoot, ccRoot))])
        self.openRmakeRepository()

        troveList = [(trv.getName(), trv.getVersion(),
                      deps.parseFlavor('!cross target: x86_64')),
                     (trv2.getName(), trv2.getVersion(),
                      deps.parseFlavor('cross target: x86_64')),
                     (trv3.getName(), trv3.getVersion(),
                      deps.parseFlavor('!cross target: x86_64'))]
        db = self.openRmakeDatabase()
        self.buildCfg.flavor = [
            deps.overrideFlavor(
                self.buildCfg.flavor[0],
                deps.parseFlavor('~cross is:x86 target:x86_64'))
        ]
        job = self.newJob(*troveList)
        db.subscribeToJob(job)
        b = builder.Builder(self.rmakeCfg, job)
        self.logFilter.add()
        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        try:
            b.build()
        except Exception:
            b.worker.stopAllCommands()
            raise
        logFile.restoreOutput()

        assert (set([x.getName() for x in b.dh.depState.getBuiltTroves()
                     ]) == set([trv.getName(),
                                trv2.getName(),
                                trv3.getName()]))
Ejemplo n.º 17
0
    def testMultipleDelayedRecipes(self):
        self.openRmakeRepository()
        db = self.openRmakeDatabase()

        trv = self.addComponent('redirect:source', '1.0-1', '',
                                [('redirect.recipe', redirectRecipe)])
        trv2 = self.addComponent('fileset-foo:source', '1.0-1', '',
                                [('fileset-foo.recipe', filesetRecipe)])
        troveList = [ trv.getNameVersionFlavor(), trv2.getNameVersionFlavor() ]
        job = self.newJob(*troveList)
        db.subscribeToJob(job)
        b = builder.Builder(self.rmakeCfg, job)
        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert(b.job.isFailed())
        failedTroves = list(b.job.iterFailedTroves())
        assert(len(failedTroves) == 2)
        group = [ x for x in failedTroves if x.getName() == trv.getName()][0]
        assert(str(group.getFailureReason()) == 'Trove failed sanity check: redirect and fileset packages must be alone in their own job')
        assert(str(b.job.getFailureReason()) == 'Job failed sanity check: redirect and fileset packages must be alone in their own job: fileset-foo, redirect')
Ejemplo n.º 18
0
    def testCopyInPolicy(self):
        trv = self.addComponent('testcase:source', '1.0-1', '',
                                [('testcase.recipe', workingRecipe)])
        self.openRmakeRepository()

        troveList = [ trv.getNameVersionFlavor() ]
        db = self.openRmakeDatabase()
        buildCfg = copy.deepcopy(self.buildCfg)
        buildCfg.strictMode = False
        buildCfg.copyInConary = True
        fakePolicyPath = resources.get_archive('policy')
        buildCfg.policyDirs = buildCfg.policyDirs + [ fakePolicyPath ]

        job = self.newJob(buildConfig=buildCfg, *troveList)
        b = builder.Builder(self.rmakeCfg, job)
        self.logFilter.add()
        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        trove = b.job.troves.values()[0]
        assert(str(trove.getFailureReason()).endswith(
                                        'This fake policy always breaks.'))
Ejemplo n.º 19
0
    def testDerivedRecipe(self):
        self.openRmakeRepository()
        db = self.openRmakeDatabase()
        trv = self.addComponent('testcase:source', '1.0-1', '',
                                [('testcase.recipe', workingRecipe)])
        self.addComponent('testcase:run', '1.0-1-1', 
                           ['/foo', '/bar'])
        self.addCollection('testcase', '1.0-1-1', [':run'])
        trv = self.addComponent('testcase:source', 
                                '/localhost@rpl:linux//branch/1.0-1',
                                [('testcase.recipe', workingRecipe)])
        trv = self.addComponent('testcase:source', 
                                '/localhost@rpl:linux//branch/1.0-1.1',
                                [('testcase.recipe', derivedRecipe)])
        troveList = [ trv.getNameVersionFlavor() ]
        job = self.newJob(*troveList)
        b = builder.Builder(self.rmakeCfg, job)

        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        b.build()
        logFile.restoreOutput()
        assert(b.job.isBuilt())
Ejemplo n.º 20
0
 def testBuildReqs(self):
     self.addComponent('foo:runtime[!cross]')
     self.addComponent('foo:runtime=2[cross]', filePrimer=1)
     trv = self.addComponent('testcase:source', '1.0-1', '',
                             [('testcase.recipe', buildReqsRecipe)])
     self.openRmakeRepository()
     db = self.openRmakeDatabase()
     job = self.newJob(trv.getNameVersionFlavor())
     db.subscribeToJob(job)
     b = builder.Builder(self.rmakeCfg, job)
     self.logFilter.add()
     logFile = logfile.LogFile(self.workDir + '/buildlog')
     logFile.redirectOutput()
     try:
         b.build()
     except Exception:
         b.worker.stopAllCommands()
         raise
     logFile.restoreOutput()
     assert b.job.isBuilt(), b.job.troves.values()[0].getFailureReason().getTraceback()
     trv = self.findAndGetTrove('testcase=rmakehost@local:linux')
     buildReqs = trv.getBuildRequirements()
     assert len(buildReqs) == 2, "Got cross req twice!"
Ejemplo n.º 21
0
 def getBuilder(self, job):
     """Create a Builder instance to build the given job"""
     return builder.Builder(self.cfg, job, db=self.db)
Ejemplo n.º 22
0
 def getBuilder(self, job):
     b = builder.Builder(self.cfg, job, db=self.db)
     self.plugins.callServerHook('server_builderInit', self, b)
     return b
Ejemplo n.º 23
0
    def testBasic(self):
        # FIXME: this is really slow - ~20 seconds.
        # Perhaps we need to make hooks to make this test faster?
        trv = self.addComponent('testcase:source', '1.0-1', '',
                                [('testcase.recipe', workingRecipe)])
        trv2 = self.addComponent('testcase2:source', '1.0-1', '',
                                [('testcase2.recipe', failingRecipe)])
        trv3 = self.addComponent('testcase3:source', '1.0-1', '',
                                [('testcase3.recipe', failedSetupRecipe)])
        trv4 = self.addComponent('testcase4:source', '1.0-1', '',
                                [('testcase4.recipe', failedLoadRecipe)])
        trv5 = self.addComponent('testcase5:source', '1.0-1', '',
                                [('testcase5.recipe', failedBuildReqRecipe)])
        self.openRmakeRepository()

        troveList = [
                (trv.getName(), trv.getVersion(), deps.parseFlavor('!ssl')),
                trv2.getNameVersionFlavor(),
                trv3.getNameVersionFlavor(),
                trv4.getNameVersionFlavor(),
                trv5.getNameVersionFlavor(),
                ]
        db = self.openRmakeDatabase()
        job = self.newJob(*troveList)
        db.subscribeToJob(job)
        b = builder.Builder(self.rmakeCfg, job)
        self.logFilter.add()
        logFile = logfile.LogFile(self.workDir + '/buildlog')
        logFile.redirectOutput()
        try:
            b.build()
        except Exception:
            b.worker.stopAllCommands()
            raise
        logFile.restoreOutput()

        assert(set([x.getName() for x in b.dh.depState.getFailedTroves()])
               == set([trv2.getName(), trv3.getName(), trv4.getName(),
                       trv5.getName()]))

        repos = self.openRepository()
        results = repos.findTrove(None, ('testcase', 'rmakehost@local:linux',
                                         deps.parseFlavor('!ssl')), 
                                         self.buildCfg.flavor)
        assert(len(results) == 1)
        assert(results[0][2] == deps.parseFlavor('~!ssl'))
        troveDict = dict((x.getName(), x)
                         for x in db.getJob(1).iterFailedTroves())
        assert(len(troveDict) == 4)
        trv2 = troveDict['testcase2:source']
        failureReason = str(trv2.getFailureReason())
        # remove the arch-specific flavor here, we're not testing that
        failureReason = re.sub(r'\[.*\]', '[FLAVOR]', failureReason)
        assert(str(failureReason) == 'Failed while building: Error building recipe testcase2:source=/localhost@rpl:linux/1.0-1[FLAVOR]: Shell command "exit 1" exited with exit code 1')
        trv3 = troveDict['testcase3:source']
        assert(str(trv3.getFailureReason()) == "Failed while loading recipe: global name 'b' is not defined")
        trv4 = troveDict['testcase4:source']
        failureReason = str(trv4.getFailureReason())
        failureReason = re.sub('/tmp.*\.recipe',
                               'TEMP.recipe',
                               failureReason)
        failureReason = re.sub('temp-testcase4.*\.recipe',
                               'testcase4.recipe',
                               failureReason)

        errStr = '''\
Failed while loading recipe: unable to load recipe file /varTEMP.recipe:
Error in recipe file "testcase4.recipe":
 Traceback (most recent call last):
  File "/varTEMP.recipe", line 1, in ?
    class TestRecipe(PackageRecipe):
  File "/varTEMP.recipe", line 4, in TestRecipe
    a = b # NameError
NameError: name 'b' is not defined
'''
        if sys.version_info > (2, 5):
            errStr = errStr.replace('?', '<module>')
        self.assertEquals(failureReason, errStr)
        trv5 = troveDict['testcase5:source']
        self.assertEquals(str(trv5.getFailureReason()),
                     'Could not satisfy build requirements: bbbbbbb:devel=[]')
        assert(str(b.job.getFailureReason()) == """\
Failed while building: Build job had failures:
   * testcase2:source: Error building recipe testcase2:source=/localhost@rpl:linux/1.0-1[%s]: Shell command "exit 1" exited with exit code 1
   * testcase3:source: Failed while loading recipe
   * testcase4:source: Failed while loading recipe
   * testcase5:source: Could not satisfy build requirements: bbbbbbb:devel=[]
""" % self.getArchFlavor())