Esempio n. 1
0
    def testRootIsNotDir(self):
        # CNY-814
        fd, fn = tempfile.mkstemp()
        os.close(fd)
        try:
            f = open(fn, 'w')
            f.close()
            try:
                db = database.Database(fn, '/var/lib/conarydb/conarydb')
            except database.OpenError, e:
                self.assertEqual(
                    str(e),
                    'Unable to open database %s/var/lib/conarydb/conarydb: '
                    '%s is not a directory' % (fn, fn))
        finally:
            os.unlink(fn)

        d = tempfile.mkdtemp()
        f = open(d + '/var', 'w')
        f.close()
        try:
            f = open(fn, 'w')
            f.close()
            try:
                db = database.Database(d, '/var/lib/conarydb/conarydb')
            except database.OpenError, e:
                self.assertEqual(
                    str(e),
                    'Unable to open database %s/var/lib/conarydb/conarydb: '
                    '%s/var is not a directory' % (d, d))
        finally:
            shutil.rmtree(d)
Esempio n. 2
0
    def _getBestOldChroot(self, buildReqs, reuseRoot, goodRootsOnly=False):
        """
            If the chroot is being reused, pick by contents of the chroot.
            Otherwise, pick oldest

            If goodRootsOnly is True, be more discerning about which chroot
            to use - only use ones that have more than half matching packages.
        """
        if not reuseRoot:
            for chroot in self.listOldChroots():
                # return oldest directory
                return sorted(self.listOldChroots(),
                              key=lambda x: os.stat(x)[stat.ST_MTIME])[0]
        buildReqsByNLF = set([(x[0], x[1].trailingLabel(), x[2]) 
                             for x in buildReqs])
        matches = {}
        for chrootPath in self.listOldChroots():
            db = database.Database(chrootPath, '/var/lib/conarydb')
            chrootContents = db.iterAllTroves()
            trovesByNLF = set([(x[0], x[1].trailingLabel(), x[2]) for x in chrootContents])
            # matches = 2*matches - extras - so an empty chroot is better than 
            # a chroot with lots of wrong troves.
            matches[chrootPath] = 2 * len(trovesByNLF.intersection(buildReqsByNLF)) - len(trovesByNLF.difference(buildReqsByNLF))
        if matches:
            rank, best = sorted((x[1], x[0]) for x in matches.iteritems())[-1]
            if rank >= len(buildReqsByNLF) or not goodRootsOnly:
                return best
Esempio n. 3
0
 def testFindTrove(self):
     db = database.Database(':memory:', ':memory:')
     self.assertEqual(db.getTransactionCounter(), 0)
     flavor = deps.parseFlavor('~readline,!foo')
     v10 = ThawVersion("/conary.rpath.com@test:trunk/10:1.2-10-1")
     f1 = files.FileFromFilesystem("/etc/passwd", self.id1)
     trv = trove.Trove("testcomp", v10, flavor, None)
     trv.addFile(self.id1, "/bin/1", v10, f1.fileId())
     trvInfo = db.addTrove(trv)
     db.addTroveDone(trvInfo)
     f2 = files.FileFromFilesystem("/etc/group", self.id2)
     v20 = ThawVersion("/conary.rpath.com@local:blah/20:1.3-2-1")
     trv = trove.Trove("testcomp", v20, flavor, None)
     trv.addFile(self.id2, "/bin/2", v20, f2.fileId())
     trvInfo = db.addTrove(trv)
     db.addTroveDone(trvInfo)
     tup = [('testcomp', v10, flavor)]
     tup2 = [('testcomp', v10, flavor), ('testcomp', v20, flavor)]
     assert (db.findTrove(None, ('testcomp', '1.2-10-1', None)) == tup)
     assert (db.findTrove(None, ('testcomp', '1.2', None)) == tup)
     assert (set(db.findTrove(
         None, ('testcomp', None, parseFlavor('!foo')))) == set(tup2))
     assert (db.findTrove(None, ('testcomp', ':trunk', None)) == tup)
     assert (db.findTrove([Label('conary.rpath.com@test:foo')],
                          ('testcomp', ':trunk', None)) == tup)
     assert (db.findTrove(None, ('testcomp', ':trunk', None)) == tup)
     assert (db.findTrove(None, ('testcomp', '@test:trunk', None)) == tup)
     assert (db.findTrove([Label('conary.rpath.com@blah:foo')],
                          ('testcomp', '@test:trunk', None)) == tup)
     # Transaction counter changes upon commit
     self.assertEqual(db.getTransactionCounter(), 0)
     db.commit()
     self.assertEqual(db.getTransactionCounter(), 1)
Esempio n. 4
0
    def testFreezeThawJobOrder(self):
        db = database.Database(':memory:', ':memory:')
        uJob = database.UpdateJob(db)
        uJob.setTransactionCounter(100)
        uJob.freeze(self.workDir)

        uJob = database.UpdateJob(db)
        uJob.thaw(self.workDir)
        self.assertEqual(uJob._jobPreScriptsByJob, None)
        self.assertEqual(uJob.getTransactionCounter(), 100)
        shutil.rmtree(self.workDir)
        os.mkdir(self.workDir)

        uJob = database.UpdateJob(db)
        uJob.setTransactionCounter(100)
        # The third argument is bogus, but thawing should still work
        uJob._jobPreScriptsByJob = [
            [(0, [0, 1], "junk"), (1, [2, 3], "more junk")],
            [(10, [10, 11], "junk"), (11, [12, 13], "more junk")],
            [(20, [20, 21], "junk"), (21, [22, 23], "more junk")],
            ["just junk"],
        ]
        uJob.freeze(self.workDir)

        uJob = database.UpdateJob(db)
        uJob.thaw(self.workDir)
        self.assertEqual(uJob._jobPreScriptsByJob, [
            [(0, [0, 1]), (1, [2, 3])],
            [(10, [10, 11]), (11, [12, 13])],
            [(20, [20, 21]), (21, [22, 23])],
        ])
        shutil.rmtree(self.workDir)
        os.mkdir(self.workDir)
Esempio n. 5
0
    def testComponentDisappears(self):
        self.addQuickTestComponent("redirect:runtime", '0.1-1-1')
        self.addQuickTestComponent("redirect:lib", '0.1-1-1', filePrimer=1)
        self.addQuickTestComponent("redirect:data", '0.1-1-1', filePrimer=2)
        self.addQuickTestCollection(
            "redirect", '0.1-1-1',
            ["redirect:runtime", "redirect:lib", "redirect:data"])

        self.addQuickTestComponent("test:runtime", '1.0-1-1')
        self.addQuickTestComponent("test:data", '1.0-1-1', filePrimer=2)
        self.addQuickTestCollection("test", '1.0-1-1',
                                    ["test:runtime", "test:data"])

        built, d = self.buildRecipe(redirectRecipe, "testRedirect")
        self.updatePkg(self.cfg.root, 'redirect', version='0.1-1-1')
        self.updatePkg(self.cfg.root, 'redirect')
        db = database.Database(self.cfg.root, self.cfg.dbPath)
        assert ([x for x in sorted(db.iterAllTroveNames())
                 ] == ['test', 'test:data', 'test:runtime'])

        self.resetRoot()
        self.checkUpdate('redirect:lib=0.1-1-1', ['redirect:lib'], apply=True)
        # the redirect for redirect:lib redirects to nothing (so is an erase)
        self.checkUpdate('redirect:lib', ['redirect:lib=0.1--'])

        # test should appear and redirect:lib should
        # go away
        self.checkUpdate('redirect', [
            'redirect:lib=0.1--', 'test=--1.0', 'test:runtime=--1.0',
            'test:data=--1.0'
        ])
Esempio n. 6
0
 def testGetCapsulesTroveList(self):
     # make sure that getCapsulesTroveList is at least not removed...
     from conary.lib import util
     d = tempfile.mkdtemp()
     util.mkdirChain(d + '/var/lib/conarydb/conarydb/')
     db = database.Database(d, '/var/lib/conarydb/conarydb')
     db.getCapsulesTroveList(db.iterAllTroves())
    def test(self):
        components = self.recipe.autopkg.components
        reqDepSet = deps.DependencySet()
        provDepSet = deps.DependencySet()
        for pkg in components.values():
            reqDepSet.union(pkg.requires)
            provDepSet.union(pkg.provides)
        self.depSet = deps.DependencySet()
        self.depSet.union(reqDepSet - provDepSet)

        depSetList = [ ]
        for dep in self.depSet.iterDepsByClass(self.depClass):
            depSet = deps.DependencySet()
            depSet.addDep(self.depClass, dep)
            depSetList.append(depSet)

        if not depSetList:
            return False

        self._initComponentExceptions()

        cfg = self.recipe.cfg
        self.db = database.Database(cfg.root, cfg.dbPath)
        self.systemProvides = self.db.getTrovesWithProvides(depSetList)
        self.unprovided = [x for x in depSetList if x not in self.systemProvides]

        self.transitiveBuildRequires = self.recipe._getTransitiveBuildRequiresNames()
        # For compatibility with older external policy that derives from this
        self.truncatedBuildRequires = self.transitiveBuildRequires

        self.setTalk()
        self.missingBuildRequires = set()

        return True
Esempio n. 8
0
    def testUpdateTroveFromChangeset(self):
        self.addQuickTestComponent("test:runtime", '1.0-1-1')
        self.addQuickTestComponent("test:lib", '1.0-1-1', filePrimer = 1)
        pkg = self.addQuickTestCollection("test", '1.0-1-1',
                                    [ ("test:lib", '1.0-1-1'),
                                      ("test:runtime", '1.0-1-1') ])

        self.addQuickTestComponent("test2:runtime", '1.0-1-1', filePrimer=3)

        self.addQuickTestComponent("test:lib", '2.0-1-1', filePrimer=2)
        repos = self.openRepository()
        (fd, path) = tempfile.mkstemp()
        os.close(fd)
        repos.createChangeSetFile(
            [('test', (None, None), (pkg.getVersion(), pkg.getFlavor()), 
                        True)], path, recurse = True)

        self.updatePkg(self.rootDir, ["test:lib=2.0"])
        self.updatePkg(self.rootDir, ["test:lib=1.0"], fromFiles = [ path ],
                        keepExisting=True)
        self.updatePkg(self.rootDir, ["test:runtime", 'test2:runtime'], 
                        fromFiles = [ path ],
                        keepExisting=True)
        os.unlink(path)

        db = database.Database(self.rootDir, self.cfg.dbPath)
        assert(sorted(db.iterAllTroveNames()) == ['test2:runtime', 'test:lib', 
                                                  'test:runtime'])
        assert(len(db.trovesByName('test:lib')) == 2)
Esempio n. 9
0
    def testFreezeThawTroveMap(self):
        db = database.Database(':memory:', ':memory:')
        uJob = database.UpdateJob(db)
        uJob.setTransactionCounter(100)

        now = 1234567890.0
        v1 = VersionFromString('/a@b:c/1.0-1', timeStamps=[now])
        v2 = VersionFromString('/a@b:c/1.0-2', timeStamps=[now + 1])
        flv1 = parseFlavor("")
        flv2 = parseFlavor("is: x86")
        trv1 = trove.Trove("trove1", v1, flv1)
        trv2 = trove.Trove("trove2", v2, flv2)
        nvf1 = trv1.getNameVersionFlavor()
        nvf2 = trv2.getNameVersionFlavor()

        uJob._troveMap[nvf1] = trv1
        uJob._troveMap[nvf2] = trv2
        expKeys = set([nvf1, nvf2])

        uJob.freeze(self.workDir)

        uJob = database.UpdateJob(db)
        uJob.thaw(self.workDir)
        self.assertEqual(uJob.getTransactionCounter(), 100)
        self.assertEqual(set(uJob._troveMap.keys()), expKeys)
        self.assertEqual(
            trv1.diff(None)[0].freeze(),
            uJob._troveMap[nvf1].diff(None)[0].freeze())
        self.assertEqual(
            trv2.diff(None)[0].freeze(),
            uJob._troveMap[nvf2].diff(None)[0].freeze())
Esempio n. 10
0
    def testVerifyToFile(self):
        db = database.Database(self.rootDir, self.cfg.dbPath)
        os.chdir(self.workDir)

        user, group = self._getUserGroup()

        self.addComponent('foo:runtime',
                          '1.0',
                          fileContents=[('/foo',
                                         rephelp.RegularFile(owner=user,
                                                             group=group))])
        self.updatePkg('foo:runtime')

        s = verify.verify(['foo:runtime'],
                          db,
                          self.cfg,
                          changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (list(cs.iterNewTroveList()) == [])

        f = open(self.rootDir + '/foo', "a")
        f.write("mod")
        f.close()

        s = self.captureOutput(verify.verify, ['foo:runtime'],
                               db,
                               self.cfg,
                               changesetPath='foo.ccs')
        assert (not s[1])
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (list(cs.iterNewTroveList())[0].getName() == 'foo:runtime')
Esempio n. 11
0
 def testVerifyRemovedFiles(self):
     # CNY-950
     self.addComponent('foo:runtime', '1.0', fileContents=['/foo'])
     self.updatePkg('foo:runtime')
     self.removeFile(self.rootDir, '/foo')
     db = database.Database(self.rootDir, self.cfg.dbPath)
     s = self.captureOutput(verify.verify, ['foo:runtime'], db, self.cfg)
     assert (not s[1])
Esempio n. 12
0
 def testBugMergeDepSuggestions(self):
     # Tests a bug in mergeDepSuggestions (referring to r)
     db = database.Database(':memory:', ':memory:')
     csjs = ChangeSetJobSource(None, db)
     allSuggs = {'a': [[]]}
     newSuggs = {'a': [[2]]}
     csjs.mergeDepSuggestions(allSuggs, newSuggs)
     self.assertEqual(allSuggs, newSuggs)
Esempio n. 13
0
 def testDbTimeout(self):
     # CNY-1840
     d = tempfile.mkdtemp()
     tmout = 12345
     try:
         db = database.Database(d, '/conarydb', timeout=tmout)
         self.assertEqual(db.db.timeout, tmout)
     finally:
         shutil.rmtree(d)
Esempio n. 14
0
 def _checkVersion(self, vers, flavorCheck=None):
     db = database.Database(self.cfg.root, self.cfg.dbPath)
     l = db.getTroveVersionList('manyflavors')
     assert (len(l) == 1)
     assert (l[0] == vers)
     if flavorCheck is not None:
         flavors = db.getAllTroveFlavors({'manyflavors': l})
         flavor = deps.parseFlavor(flavorCheck)
         assert (flavors['manyflavors'][vers] == [flavor])
Esempio n. 15
0
    def testClose(self):
        dbobj = database.Database(':memory:', ':memory:')
        dbobj2 = database.Database(':memory:', ':memory:')
        # Make _db be non-None
        dbobj.db
        dbobj2.db

        uJob = database.UpdateJob(dbobj)
        uJob.close()
        self.assertEqual(dbobj._db, None)

        # We close correctly even if the search source object doesn't have a
        # db property
        uJob = database.UpdateJob(dbobj)
        uJob.troveSource.db = dbobj

        class MockSearchSource(object):
            pass

        uJob.setSearchSource(MockSearchSource())
        uJob.close()
        self.assertEqual(dbobj._db, None)

        # or the property is None
        uJob = database.UpdateJob(dbobj)

        class MockSearchSource(object):
            db = None

        uJob.setSearchSource(MockSearchSource())
        uJob.close()
        self.assertEqual(dbobj._db, None)

        # ... or real
        uJob = database.UpdateJob(dbobj)
        uJob = database.UpdateJob(dbobj)

        class MockSearchSource(object):
            db = dbobj2

        uJob.setSearchSource(MockSearchSource())
        uJob.close()
        self.assertEqual(dbobj._db, None)
        self.assertEqual(dbobj2._db, None)
Esempio n. 16
0
    def testPrelink(self):
        user = pwd.getpwuid(os.getuid()).pw_name
        group = grp.getgrgid(os.getgid()).gr_name
        archivePath = resources.get_archive()
        self.addComponent('test:foo=1',
                          fileContents=[
                              ('/prelinktest',
                               rephelp.RegularFile(
                                   contents=open(archivePath + '/prelinktest'),
                                   owner=user,
                                   group=group,
                                   mode=0755)),
                              ('/prelinktest-orig',
                               rephelp.RegularFile(
                                   contents=open(archivePath + '/prelinktest'),
                                   owner=user,
                                   group=group,
                                   mode=0755))
                          ])
        self.updatePkg('test:foo=1')

        db = database.Database(self.rootDir, self.cfg.dbPath)
        rc, str = self.captureOutput(verify.verify, ['test:foo'], db, self.cfg)
        self.assertEquals(str, '')

        binary = self.rootDir + '/prelinktest'
        # the test suite can't set the mtime on the file; we'll preserve
        # it ourself
        sb = os.stat(binary)
        os.system("cp %s/prelinktest-prelinked %s" % (archivePath, binary))
        os.utime(binary, (sb.st_atime, sb.st_mtime))

        self.assertEquals(files.PRELINK_CMD, ('/usr/sbin/prelink', ))
        oldCmd = files.PRELINK_CMD
        try:
            files.PRELINK_CMD = (archivePath + '/prelink', )
            files._havePrelink = None
            rc, str = self.captureOutput(verify.verify, ['test:foo'],
                                         db,
                                         self.cfg,
                                         forceHashCheck=True)
            self.assertEquals(str, '')

            # Also verify a path used by addCapsule
            f, nlinks, devino = files.FileFromFilesystem(binary,
                                                         pathId='\0' * 16,
                                                         inodeInfo=True)
            self.assertEquals(
                digestlib.sha1(open(binary).read()).hexdigest(),
                '1114f3a978b60d76d7618dc43aaf207bc999f997')
            self.assertEquals(f.contents.sha1().encode('hex'),
                              '23ad3a2c940a30809b68a5b8a13392196004efab')
        finally:
            files.PRELINK_CMD = oldCmd
            files._havePrelink = None
Esempio n. 17
0
 def testEnsureReadableRollbacks(self):
     from conary.lib import util
     d = tempfile.mkdtemp()
     util.mkdirChain(d + '/var/lib/conarydb/conarydb/rollbacks')
     try:
         open(d + '/var/lib/conarydb/conarydb/rollbacks/status',
              'w').write('0 0\n')
         db = database.Database(d, '/var/lib/conarydb/conarydb')
         db._ensureReadableRollbackStack()
     finally:
         shutil.rmtree(d)
Esempio n. 18
0
 def testEraseChangeSet(self):
     db = database.Database(self.rootDir, self.cfg.dbPath)
     self.repos = self.openRepository()
     self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")')
     self.cookTestPkg(1)
     os.chdir(self.workDir)
     cscmd.ChangeSetCommand(self.cfg, ['test1=1.0--'], 'test.ccs')
     cs = changeset.ChangeSetFromFile('test.ccs')
     rc, res = self.captureOutput(displayChangeSet, db, cs, ['test1=1.0'],
                                  self.cfg)
     assert (res == 'Erase   test1=1.0-1-1\n')
Esempio n. 19
0
    def testVerifyWithSignatures(self):
        # Make sure that verify works with troves that have
        # missing components, which means that the collection's signature
        # is no good...
        self.addComponent('foo:runtime', '1.0', '', ['/foo'])
        self.addComponent('foo:data', '1.0')
        self.addCollection('foo', '1.0', [':runtime', ':data'])
        self.updatePkg(['foo', 'foo:runtime'], recurse=False)
        self.writeFile(self.rootDir + '/foo', 'newtext')

        db = database.Database(self.rootDir, self.cfg.dbPath)
        self.captureOutput(verify.verify, ['foo'], db, self.cfg)
Esempio n. 20
0
 def testGetTrovesWithProvides(self):
     v = '/localhost@rpl:linux/1.0-1-1'
     f = ''
     db = database.Database(self.rootDir, self.cfg.dbPath)
     prov1 = deps.parseDep('trove: test1:runtime')
     prov2 = deps.parseDep('trove: test2:runtime')
     self.addQuickDbTestPkg(db, 'test1', v, f, provides=prov1)
     self.addQuickDbTestPkg(db, 'test2', v, f, provides=prov2)
     self.addQuickDbTestPkg(db, 'test1-foo', v, f, provides=prov1)
     provMap = db.getTrovesWithProvides([prov1, prov2])
     assert (sorted(x[0] for x in provMap[prov1]) == ['test1', 'test1-foo'])
     assert ([x[0] for x in provMap[prov2]] == ['test2'])
Esempio n. 21
0
    def test(self):
        # use flags track their provider only if the
        # _getTransitiveBuildRequiresNames recipe method exists
        try:
            self.transitiveBuildRequires = self.recipe._getTransitiveBuildRequiresNames()
        except AttributeError:
            return False

        cfg = self.recipe.cfg
        self.db = database.Database(cfg.root, cfg.dbPath)
        self.setTalk()

        return True
Esempio n. 22
0
    def testCommitLock(self):
        d = tempfile.mkdtemp()
        try:
            db = database.Database(d, '/var/lib/conarydb/conarydb')
            db.commitLock(True)
            childPid = os.fork()
            if childPid == 0:
                db.close()
                db = database.Database(d, '/var/lib/conarydb/conarydb')
                try:
                    db.commitLock(True)
                except errors.DatabaseLockedError:
                    os._exit(0)
                except Exception:
                    pass

                os._exit(1)

            pid, status = os.waitpid(childPid, 0)
            assert (status == 0)
        finally:
            shutil.rmtree(d)
Esempio n. 23
0
    def testLoadInstalledScoring(self):
        # set up all of the variables that loadRecipe expects to be
        # available at the module level
        db = database.Database(self.cfg.root, self.cfg.dbPath)
        repos = self.openRepository()
        branch = versions.VersionFromString('/localhost@rpl:linux//shadow/')

        self.addTestPkg(1, version='1.0')
        self.addTestPkg(1, version='2.0')

        self.addQuickDbTestPkg(db, 'test1', '/localhost@rpl:linux/1:1.0-1-1',
                               '')
        self.addQuickDbTestPkg(db, 'test1', '/localhost@rpl:linux/2:2.0-1-1',
                               '')

        loader = self._testSubload(repos,
                                   "loadInstalled('test1')",
                                   branch=branch)
        assert (loader.module.TestRecipe1.version == '2.0')
        self.resetRoot()

        db = database.Database(self.cfg.root, self.cfg.dbPath)

        self.addTestPkg(2, version='3.0')
        self.addTestPkg(2, version='4.0')
        self.mkbranch(['test2:source=3.0'], "@rpl:test2")
        self.mkbranch(['test2:source=:test2'], "@rpl:shadow", shadow=True)
        self.mkbranch(['test2:source=4.0'], "@rpl:shadow", shadow=True)

        self.addQuickDbTestPkg(
            db, 'test2', '/localhost@rpl:linux//test2//shadow/2:3.0-1-1', '')
        self.addQuickDbTestPkg(db, 'test2',
                               '/localhost@rpl:linux//shadow/1:4.0-1-1', '')
        loader = self._testSubload(repos,
                                   "loadInstalled('test2')",
                                   db=db,
                                   branch=branch)
        assert (loader.module.TestRecipe2.version == '4.0')
Esempio n. 24
0
    def testVerifyAll(self):
        os.chdir(self.workDir)
        self.addComponent('foo:runtime', '1.0', fileContents=['/bin/b'])
        self.addComponent('bar:lib', '1.0', fileContents=['/lib/l'])
        self.addCollection('foo', [':runtime'])
        self.addCollection('bar', [':lib'])
        db = database.Database(self.rootDir, self.cfg.dbPath)
        self.updatePkg('foo')
        self.updatePkg('bar')

        verify.verify([], db, self.cfg, all=True, changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (sorted([x.getName() for x in cs.iterNewTroveList()
                        ]) == ['bar:lib', 'foo:runtime'])
Esempio n. 25
0
    def testSimple(self):
        r1 = self.addComponent('test:runtime',
                               '1.0-1-1',
                               fileContents=[],
                               requires='trove: test:doc')
        r2 = self.addComponent(
            'test:runtime',
            '2.0-1-1',
            fileContents=[],
            requires='soname: ELF32/foo.so.0(a b c) trove: test:doc')
        d1 = self.addComponent('test:doc', '1.0-1-1', filePrimer=1)
        l1 = self.addComponent('test:lib',
                               '1.0-1-1',
                               filePrimer=2,
                               provides='soname: ELF32/foo.so.0(a b c d)')

        db = database.Database(':memory:', ':memory:')
        db.addTrove(r1)

        repos = self.openRepository()
        relCs = repos.createChangeSet([
            ('test:runtime', (r1.getVersion(), r1.getFlavor()),
             (r2.getVersion(), r2.getFlavor()), False)
        ])

        absCs = repos.createChangeSet([
            ('test:doc', (None, None), (d1.getVersion(), d1.getFlavor()),
             False),
            ('test:lib', (None, None), (l1.getVersion(), l1.getFlavor()),
             False)
        ])

        trvSrc = ChangesetFilesTroveSource(db, storeDeps=True)
        trvSrc.addChangeSet(relCs)
        trvSrc.addChangeSet(absCs)

        for trv in (r2, d1, l1):
            [otherTrv] = trvSrc.getTroves(
                [(trv.getName(), trv.getVersion(), trv.getFlavor())],
                withFiles=False)
            assert (trv == otherTrv)

        suggMap = trvSrc.resolveDependencies(
            None, [r2.getRequires(), r1.getRequires()])
        assert (suggMap[r1.getRequires()] == [[(d1.getName(), d1.getVersion(),
                                                d1.getFlavor())]])
        suggs = suggMap[r2.getRequires()]
        assert ([(d1.getName(), d1.getVersion(), d1.getFlavor())] in suggs)
        assert ([(l1.getName(), l1.getVersion(), l1.getFlavor())] in suggs)
Esempio n. 26
0
 def testIntermediateDirNotWritable(self):
     # CNY-2405
     d = tempfile.mkdtemp()
     try:
         os.mkdir(d + '/var', 0400)
         try:
             db = database.Database(d, '/var/lib/conarydb/conarydb')
         except database.OpenError, e:
             self.assertEqual(
                 str(e),
                 'Unable to open database %s/var/lib/conarydb/conarydb: '
                 'cannot create directory %s/var/lib' % (d, d))
     finally:
         os.chmod(d + '/var', 0755)
         shutil.rmtree(d)
Esempio n. 27
0
def _cookTrove(cfg, repos, name, version, flavorList, targetLabel,
               loadSpecsList, csFile, buildReqs, crossReqs, failureFd, logger):
    baseFlavor = cfg.buildFlavor
    db = database.Database(cfg.root, cfg.dbPath)
    buildLabel = version.trailingLabel()
    buildBranch = version.branch()
    binaryBranch = version.getBinaryVersion().branch()
    if targetLabel:
        source = recipeutil.RemoveHostSource(db, targetLabel.getHost())
        if version.trailingLabel() == targetLabel and version.depth() > 1:
            buildBranch = version.branch().parentBranch()
            buildLabel = buildBranch.label()
            revision = versions.Revision('1-1')
            binaryBranch = buildBranch.createVersion(revision)\
                                            .getBinaryVersion().branch()
    else:
        source = db
    loaders = []
    recipeClasses = []

    if not isinstance(flavorList, (tuple, list)):
        flavorList = [flavorList]
    if not isinstance(loadSpecsList, (tuple, list)):
        loadSpecsList = [loadSpecsList] * len(flavorList)

    for flavor, loadSpecs in itertools.izip(flavorList, loadSpecsList):
        try:
            logger.debug('Cooking %s=%s[%s] to %s (stored in %s)' % \
                         (name, version, flavor, targetLabel, csFile))
            cfg.buildFlavor = deps.overrideFlavor(baseFlavor, flavor)
            cfg.initializeFlavors()
            (loader, recipeClass, localFlags, usedFlags)  = \
                recipeutil.loadRecipeClass(repos, name, version,
                                           cfg.buildFlavor,
                                           ignoreInstalled=False, root=cfg.root,
                                           loadInstalledSource=source,
                                           overrides=loadSpecs,
                                           cfg=cfg)
            loaders.append(loader)
            recipeClasses.append(recipeClass)
            recipeClass.buildRequirementsOverride = buildReqs
            recipeClass.crossRequirementsOverride = crossReqs
        except Exception, msg:
            errMsg = 'Error loading recipe %s=%s[%s]: %s' % \
                                            (name, version, flavor, str(msg))
            _buildFailed(failureFd, errMsg, traceback.format_exc())
Esempio n. 28
0
    def testUpdateJobiterJobPreScriptsForJobSet(self):
        db = database.Database(':memory:', ':memory:')
        uJob = database.UpdateJob(db)

        js1 = ("trove1", (None, None), ('/a@b:c/1.0-1', ""), True)
        js2 = ("trove2", ('/a@b:c/1.0-1', None), ('/a@b:c/1.0-2', ""), True)
        js3 = ("trove3", (None, None), ('/a@b:c/1.0-1', ""), True)
        js4 = ("trove4", ('/a@b:c/1.0-1', None), ('/a@b:c/1.0-2', ""), True)
        js5 = ("trove5", ('/a@b:c/1.0-1', None), (None, None), True)
        js6 = ("trove6", ('/a@b:c/1.0-1', None), (None, None), True)

        uJob.jobs = [[js1, js2, js5], [js3, js4, js6]]

        sc1 = (js1, "preinst1", 0, 1, "preinstall")
        sc2 = (js3, "preinst3", 0, 1, "preinstall")
        sc3 = (js2, "preup2", 0, 1, "preupdate")
        sc4 = (js4, "preup4", 0, 1, "preupdate")
        sc5 = (js5, "preer5", 0, 1, "preerase")
        sc6 = (js6, "preer6", 0, 1, "preerase")
        sc7 = (js2, "prerb2", 0, 1, "prerollback")
        sc8 = (js4, "prerb4", 0, 1, "prerollback")
        uJob._jobPreScripts = [sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8]

        uJob._jobPreScriptsByJob = [
            [(0, [6]), (1, [7])],
            [(0, [0]), (1, [1])],
            [(0, [2]), (1, [3])],
            [(0, [4]), (1, [5])],
        ]
        ret = list(uJob.iterJobPreScriptsForJobSet(0))
        self.assertEqual(ret, [sc7, sc1, sc3, sc5])

        ret = list(uJob.iterJobPreScriptsForJobSet(1))
        self.assertEqual(ret, [sc8, sc2, sc4, sc6])

        # Trigger an AssertionError
        uJob._jobPreScriptsByJob = [[], [(0, [2]), (1, [3])], [], []]
        self.assertRaises(AssertionError, list,
                          uJob.iterJobPreScriptsForJobSet(0))

        # No data
        uJob._jobPreScripts = []
        uJob._jobPreScriptsByJob = None
        ret = list(uJob.iterJobPreScriptsForJobSet(0))
        self.assertEqual(ret, [])
Esempio n. 29
0
    def testPartialChangeSet(self):
        db = database.Database(self.rootDir, self.cfg.dbPath)
        self.repos = self.openRepository()
        self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")')
        self.cookTestPkg(1)
        self.cfg.configLine('excludeTroves .*:runtime')
        os.chdir(self.workDir)
        cscmd.ChangeSetCommand(self.cfg, ['test1'], 'test.ccs')
        cs = changeset.ChangeSetFromFile('test.ccs')
        rc, res = self.captureOutput(displayChangeSet,
                                     None,
                                     cs, ['test1=1.0-1-1'],
                                     self.cfg,
                                     showTroves=True)

        assert (res == '''\
test1=1.0-1-1
  test1:runtime=1.0-1-1
''')
Esempio n. 30
0
    def testRollbackPerms(self):
        rbPath = self.rootDir + self.cfg.dbPath + '/rollbacks'

        self.addComponent('foo:runtime', '1.0')
        self.updatePkg('foo:runtime')
        assert(os.stat(rbPath).st_mode
                    & 0777 == 0700)
        assert(os.stat(rbPath + '/status').st_mode
                    & 0777 == 0600)
        assert(os.stat(rbPath + '/0').st_mode
                    & 0777 == 0700)
        assert(os.stat(rbPath + '/0/count').st_mode
                    & 0777 == 0600)
        assert(os.stat(rbPath + '/0/local.0').st_mode
                    & 0777 == 0600)
        assert(os.stat(rbPath + '/0/repos.0').st_mode
                    & 0777 == 0600)

        # ensure we can open the database even though we can't read the
        # rollback status
        try:
            os.chmod(rbPath + '/status', 000)
            db = database.Database(self.rootDir, self.cfg.dbPath)
            # And make sure we get an exception when trying to read the
            # rollback
            try:
                db.getRollbackStack().getList()
                self.fail("ConaryError not raised")
            except errors.ConaryError, e:
                self.assertEqual(str(e),
                    "Unable to open rollback directory")
            except:
                self.fail("Wrong exception raised: %s" % sys.exc_info()[1])

            # Same deal with hasRollback() since it's a different code path
            # than getList()

            try:
                db.rollbackStack.hasRollback('r.1')
                self.fail("ConaryError not raised")
            except errors.ConaryError, e:
                self.assertEqual(str(e),
                    "Unable to open rollback directory")