Esempio n. 1
0
    def test_package_parse_str_invalid(self):
        with self.assertRaises(TypeError):
            Repository.parse_str(1)


        with self.assertRaises(ValueError):
            Repository.parse_str('repo --mirrorlist=http://fakeurl --baseurl=http://alsofake')
Esempio n. 2
0
    def test_repo_parse_empty(self):
        # Must match string, dnf repo, or dictionary
        with self.assertRaises(TypeError):
            Repository(1)

        r1 = Repository({'name': 'testrepo'})

        self.assertEqual('testrepo', r1.name)
        self.assertEqual(None, r1.stub)

        self.assertEqual(None, r1.baseurl)
        self.assertEqual(None, r1.mirrorlist)
        self.assertEqual(None, r1.metalink)

        self.assertEqual(None, r1.gpgkey)
        self.assertEqual(None, r1.enabled)
        self.assertEqual(None, r1.gpgcheck)
        self.assertEqual(None, r1.cost)
        self.assertEqual(False, r1.install)

        self.assertEqual(None, r1.exclude_packages)
        self.assertEqual(None, r1.include_packages)

        self.assertEqual(None, r1.priority)

        self.assertEqual(None, r1.meta_expired)

        self.assertEqual(r1.action, Repository.ACTION_INCLUDE)
Esempio n. 3
0
 def test_repo__parse_str_arg(self):
     # Double Quotes
     self.assertEqual(Repository._parse_str_arg('name="korora"', 'name='), 'korora')
     # No Quotes
     self.assertEqual(Repository._parse_str_arg('name=korora 23', 'name='), 'korora 23')
     # Single Quotes
     self.assertEqual(Repository._parse_str_arg("name='korora 23'", 'name='), 'korora 23')
Esempio n. 4
0
    def test_package_parse_str_invalid(self):
        with self.assertRaises(TypeError):
            Repository.parse_str(1)

        with self.assertRaises(ValueError):
            Repository.parse_str(
                'repo --mirrorlist=http://fakeurl --baseurl=http://alsofake')
Esempio n. 5
0
    def test_repo_parse_str_proxy(self):
        r1 = Repository('repo --name="Test" --proxy="https://fakeproxy"')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual('https://fakeproxy', r1.proxy)

        # Unset
        self.assertEqual(None, r2.proxy)
Esempio n. 6
0
    def test_repo_parse_str_cost(self):
        r1 = Repository('repo --name="Test" --cost="1"')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Double Quoted
        self.assertEqual('1', r1.cost)

        # Unset
        self.assertEqual(None, r2.cost)
Esempio n. 7
0
    def test_repo_parse_str_install(self):
        r1 = Repository('repo --name="Korora 23 - i386 - Updates" --install')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual(True, r1.install)

        # Unset
        self.assertEqual(False, r2.install)
Esempio n. 8
0
    def test_repo_parse_str_mirrorlist(self):
        r1 = Repository('repo --name="Test" --mirrorlist="https://fakeurl"')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual('https://fakeurl', r1.mirrorlist)

        # Unset
        self.assertEqual(None, r2.mirrorlist)
Esempio n. 9
0
    def test_reposet_equality(self):
        r1 = Repository({'n': 'test', 's': 'foo', 'bu': 'x'})
        r2 = Repository({'n': 'test', 's': 'foo', 'bu': 'y'})

        l1 = RepoSet()
        l2 = RepoSet()

        l1.add(r1)
        l2.add(r2)
        self.assertEqual(l1, l2)
Esempio n. 10
0
    def test_repo_parse_str_noverifyssl(self):
        r1 = Repository(
            'repo --name="Korora 23 - i386 - Updates" --noverifyssl')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual(True, r1.noverifyssl)

        # Unset
        self.assertEqual(False, r2.noverifyssl)
Esempio n. 11
0
 def test_repo__parse_str_arg(self):
     # Double Quotes
     self.assertEqual(Repository._parse_str_arg('name="korora"', 'name='),
                      'korora')
     # No Quotes
     self.assertEqual(Repository._parse_str_arg('name=korora 23', 'name='),
                      'korora 23')
     # Single Quotes
     self.assertEqual(
         Repository._parse_str_arg("name='korora 23'", 'name='),
         'korora 23')
Esempio n. 12
0
    def test_reposet_difference(self):
        r1 = Repository({'n': 'test', 's': 'foo', 'bu': 'x'})
        r2 = Repository({'n': 'test', 's': 'bar', 'bu': 'y'})
        r3 = Repository({'n': 'test', 's': 'baz'})
        r4 = Repository({'n': 'test', 's': 'car'})

        l1 = RepoSet([r1, r2, r3])
        l2 = RepoSet([r2, r3, r4])

        (luniq1, luniq2) = l1.difference(l2)

        self.assertEqual(RepoSet([r1]), luniq1)
        self.assertEqual(RepoSet([r4]), luniq2)
Esempio n. 13
0
    def test_repo_equality(self):
        r1 = Repository({'n': 'test', 's': 'foo'})
        r2 = Repository({'n': 'test', 's': 'foo', 'bu': 'foo'})
        r3 = Repository({'n': 'test', 's': 'bar', 'bu': 'foo'})
        r4 = Repository({'n': 'test', 's': 'bar', 'bu': 'foo1'})
        r5 = Repository({'n': 'test', 's': 'baz', 'bu': 'foo1'})

        # stub is the equality check
        self.assertEqual(r1, r2)
        self.assertNotEqual(r2, r3)
        self.assertEqual(r3, r4)
        self.assertNotEqual(r4, r5)
        self.assertNotEqual(r4, 'str')
Esempio n. 14
0
    def test_repo_parse_str_ignoregroups(self):
        r1 = Repository(
            'repo --name="Korora 23 - i386 - Updates" --ignoregroups=true')
        r3 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual(True, r1.ignoregroups)

        # fedora documentation implies that it must be --ignoregroups=true
        with self.assertRaises(ValueError):
            Repository(
                'repo --name="Korora 23 - i386 - Updates" --ignoregroups')

        # Unset
        self.assertEqual(False, r3.ignoregroups)
Esempio n. 15
0
    def test_reposet_uniqueness(self):
        r1 = Repository({'n': 'test', 's': 'foo', 'bu': 'x'})
        r2 = Repository({'n': 'test', 's': 'foo', 'bu': 'y'})
        r3 = Repository({'n': 'test', 's': 'bar', 'bu': 'x'})

        l1 = RepoSet()

        l1.add(r1)
        self.assertTrue(len(l1) == 1)

        l1.add(r2)
        self.assertTrue(len(l1) == 1)
        self.assertEqual(l1[0].baseurl, 'x')

        l1.add(r3)
        self.assertTrue(len(l1) == 2)
Esempio n. 16
0
    def test_repo_parse_str_baseurl(self):
        r1 = Repository('repo --name="Test" --baseurl="https://fakeurl"')
        r2 = Repository('repo --name="Korora 23 - i386 - Updates"')
        r3 = Repository(
            'repo --name="Test" --baseurl="https://fakeurl,http://backupfakeurl"'
        )

        # Set
        self.assertEqual(['https://fakeurl'], r1.baseurl)

        # Unset
        self.assertEqual(None, r2.baseurl)

        # List
        self.assertEqual(['https://fakeurl', 'http://backupfakeurl'],
                         r3.baseurl)
Esempio n. 17
0
 def test_repo___repr__(self):
     r1 = Repository(
         'repo --name="Korora 23 - i386 - Updates" --ignoregroups=true')
     self.assertEqual(
         repr(r1),
         'Repository: {"e":true,"i":false,"n":"Korora 23 - i386 - Updates","s":"korora-23-i386-updates","z":1}'
     )
Esempio n. 18
0
 def test_repo___str__(self):
     r1 = Repository(
         'repo --name="Korora 23 - i386 - Updates" --ignoregroups=true')
     self.assertEqual(
         str(r1),
         'Repository: repo --name="Korora 23 - i386 - Updates" --ignoregroups=true'
     )
Esempio n. 19
0
    def test_repo_parse_str_tilda(self):
        r1 = Repository('~repo --name="Korora 23 - i386 - Updates"')

        # Ensure that stub is parsed out of exclude format
        self.assertEqual('korora-23-i386-updates', r1.stub)

        # Repo is Excluded
        self.assertEqual(r1.action, Repository.ACTION_EXCLUDE)
Esempio n. 20
0
    def test_repo_parse_str_excludepkgs(self):
        r1 = Repository(
            'repo --name="Korora 23 - i386 - Updates" --excludepkgs=foo,bar,baz'
        )
        r2 = Repository(
            'repo --name="Korora 23 - i386 - Updates" --excludepkgs=foo')
        r3 = Repository(
            'repo --name="Korora 23 - i386 - Updates" --excludepkgs=foo,')
        r4 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Set
        self.assertEqual(['foo', 'bar', 'baz'], r1.exclude_packages)

        # Single
        self.assertEqual(['foo'], r2.exclude_packages)

        # Hanging seperator
        self.assertEqual(['foo'], r3.exclude_packages)

        # Unset
        self.assertEqual(None, r4.exclude_packages)
Esempio n. 21
0
    def run_rm(self):
        t = Template(self.args.template, user=self.args.username)

        try:
            t = self.cs.template_get(t)

        except ServiceException as e:
            print(e)
            return 1

        repos = []

        for r in self.args.repo:
            r = Repository(r)
            if t.remove_repo(r):
                repos.append(r)

        repos.sort(key=lambda x: x.stub)

        # describe process for dry runs
        if self.args.dry_run:
            if len(repos):
                print('The following would be removed from the template: {0}'.
                      format(t.name))

                for r in repos:
                    print('  - ' + str(r))

                print()
                print('Summary:')
                print('  - Repo(s): %d' % (len(repos)))
                print()

            else:
                print('No template changes required.')

            print('No action peformed during this dry-run.')
            return 0

        if not len(repos):
            print('info: no changes detected, template up to date.')
            return 0

        # push our updated template
        try:
            res = self.cs.template_update(t)

        except ServiceException as e:
            print(e)
            return 1
Esempio n. 22
0
    def _parse_template(self, template):
        # parse the string short form
        if isinstance(template, str):
            (user, name, version) = self._parse_unv(template)

            if user:
                self._user = user

            if name:
                self._name = name

            if version:
                self._version = version

            if not self._user or len(self._user) == 0:
                raise ValueError("template format invalid")

            if not self._name or len(self._name) == 0:
                raise ValueError("template format invalid")

        # parse the dict form, the most common form and directly
        # relates to the json structures returned by canvas server
        elif isinstance(template, dict):
            self._uuid = template.get('uuid', None)
            self._user = template.get('user', template.get('username', None))
            self._name = template.get('stub', None)
            self._version = template.get('version', None)
            self._title = template.get('name', self._name)
            self._description = template.get('description', None)

            self._includes = template.get('includes', [])

            self._repos = RepoSet(
                Repository(r, template=self.unv)
                for r in template.get('repos', []))
            self._packages = PackageSet(
                Package(p, template=self.unv)
                for p in template.get('packages', []))

            self._stores = template.get('stores', [])
            self._objects = ObjectSet(
                Object(o) for o in template.get('objects', []))

            self._meta = template.get('meta', {})
Esempio n. 23
0
    def from_system(cls, all=False):
        system_template = cls('local:system')
        db = dnf.Base()
        try:
            db.fill_sack()

        except OSError as e:
            pass

        if all:
            p_list = db.sack.query().installed()

        else:
            p_list = db.iter_userinstalled()

        for p in p_list:
            system_template.add_package(Package(p, evr=False))

        for r in db.repos.enabled():
            system_template.add_repo(Repository(r))
        return system_template
Esempio n. 24
0
    def run_add(self):
        t = Template(self.args.template, user=self.args.username)

        try:
            t = self.cs.template_get(t)

        except ServiceException as e:
            print(e)
            return 1

        # default enabled
        if self.args.enabled is None:
            self.args.enabled = True

        r = Repository({
            'stub': self.args.repo,
            'name': self.args.name,
            'baseurl': self.args.baseurl,
            'mirrorlist': self.args.mirrorlist,
            'metalink': self.args.metalink,
            'enabled': self.args.enabled,
            'cost': self.args.cost,
            'priority': self.args.priority,
            'gpgkey': self.args.gpgkey,
            'gpgcheck': self.args.gpgcheck,
            'exclude': self.args.exclude
        })

        t.add_repo(r)

        # push our updated template
        try:
            res = self.cs.template_update(t)

        except ServiceException as e:
            print(e)
            return 1

        print('info: repo added.')
        return 0
Esempio n. 25
0
    def test_repo_to_kickstart(self):
        repo_str_1 = 'repo --name=fedora --baseurl=http://fedoraproject.org/ --install'
        repo_str_2 = 'repo --name=fedora2 --mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch'
        # TODO: Metalink cannot be specified in string mode

        repo_str_3 = 'repo --name=fedora3 --cost=1337 --excludepkgs=1'
        repo_str_4 = 'repo --name=fedora3 --excludepkgs=python,perl --proxy=http://fakeproxy:1337'

        repo_str_5 = 'repo --name=fedora3 --includepkgs=python --ignoregroups=true'
        repo_str_6 = 'repo --name=fedora3 --includepkgs=python,ruby --noverifyssl'

        repo1 = Repository(repo_str_1)
        repo2 = Repository(repo_str_2)
        repo3 = Repository(repo_str_3)
        repo4 = Repository(repo_str_4)
        repo5 = Repository(repo_str_5)
        repo6 = Repository(repo_str_6)

        ks1 = repo1.to_kickstart()
        ks2 = repo2.to_kickstart()
        ks3 = repo3.to_kickstart()
        ks4 = repo4.to_kickstart()
        ks5 = repo5.to_kickstart()
        ks6 = repo6.to_kickstart()

        # baseurl and install
        self.assertEqual(repo_str_1, ks1)
        # mirrorlist
        self.assertEqual(repo_str_2, ks2)

        # cost and exclude one package
        self.assertEqual(repo_str_3, ks3)
        # proxy and exclude multiple packages
        self.assertEqual(repo_str_4, ks4)

        # ignoregroups and include one package
        self.assertEqual(repo_str_5, ks5)
        # noverifyssl and include multiple packages
        self.assertEqual(repo_str_6, ks6)
Esempio n. 26
0
 def test_package_parse_str_from_name(self):
     d1 = Repository.parse_str('validreponame')
     # Name set
     self.assertEqual('validreponame', d1['name'])
Esempio n. 27
0
    def test_repo_to_kickstart(self):
        repo_str_1 = 'repo --name=fedora --baseurl=http://fedoraproject.org/ --install'
        repo_str_2 = 'repo --name=fedora2 --mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch'
        # TODO: Metalink cannot be specified in string mode

        repo_str_3 = 'repo --name=fedora3 --cost=1337 --excludepkgs=1'
        repo_str_4 = 'repo --name=fedora3 --excludepkgs=python,perl --proxy=http://fakeproxy:1337'

        repo_str_5 = 'repo --name=fedora3 --includepkgs=python --ignoregroups=true'
        repo_str_6 = 'repo --name=fedora3 --includepkgs=python,ruby --noverifyssl'

        repo1 = Repository(repo_str_1)
        repo2 = Repository(repo_str_2)
        repo3 = Repository(repo_str_3)
        repo4 = Repository(repo_str_4)
        repo5 = Repository(repo_str_5)
        repo6 = Repository(repo_str_6)

        ks1 = repo1.to_kickstart()
        ks2 = repo2.to_kickstart()
        ks3 = repo3.to_kickstart()
        ks4 = repo4.to_kickstart()
        ks5 = repo5.to_kickstart()
        ks6 = repo6.to_kickstart()

        # baseurl and install
        self.assertEqual(repo_str_1, ks1)
        # mirrorlist
        self.assertEqual(repo_str_2, ks2)

        # cost and exclude one package
        self.assertEqual(repo_str_3, ks3)
        # proxy and exclude multiple packages
        self.assertEqual(repo_str_4, ks4)

        # ignoregroups and include one package
        self.assertEqual(repo_str_5, ks5)
        # noverifyssl and include multiple packages
        self.assertEqual(repo_str_6, ks6)
Esempio n. 28
0
    def _parse_kickstart(self, path):
        """
        Loads the template with information from the supplied kickstart path.

        Kickstarts predominately populate the meta tag, similar to the following:
          'kickstart': {
            'platform': '',
            'version':  'DEVEL',
            'language': 'en_US.UTF-8',
            'keyboard': 'us'
            'timezone': 'US/Eastern'
            'auth':     '--useshadow --passalgo=sha512
            'selinux':  '--enforcing'
            'firewall': '--enabled --service=mdns
            'xconfig':  '--startxonboot'
            'part':     '/ --size 4096 --fstype ext4',
            'services': '--enabled=NetworkManager,ModemManager --disabled=network,sshd'
            'commands': [
            ],
          },
        }

        Currently scripts are converted to canvas objects, repo commands are converted to canvas
        repos and packages are converted to canvas packages.

        Args:
          path: Path to existing kickstart file.

        Returns:
          Nothing.

        Raises:
          IOError: An error occurred accessing the kickstart file.
        """

        ksversion = makeVersion(DEVEL)
        ksparser = pykickstart.parser.KickstartParser(ksversion)

        try:
            ksparser.readKickstart(path)

        except IOError as msg:
            print("Failed to read kickstart file '{0}' : {1}".format(
                path, msg))
            return

        except pykickstart.errors.KickstartError as e:
            print("Failed to parse kickstart file '{0}' : {1}".format(
                path, msg))
            return

        handler = ksparser.handler

        meta = {}

        if handler.platform:
            meta['platform'] = handler.platform
            meta['version'] = versionToString(handler.version)

        lst = list(handler._writeOrder.keys())
        lst.sort()

        for prio in lst:
            for c in handler._writeOrder[prio]:
                # we don't store null commands (why pykickstart? why?)
                if c.currentCmd.strip() == '':
                    continue

                # store repo commands as canvas templates
                elif c.currentCmd == 'repo':
                    for r in c.__str__().split('\n'):
                        # ignore blank lines
                        if len(r.strip()) == 0:
                            continue

                        self.add_repo(Repository(r))

                # otherwise store commands as canvas objects
                else:
                    self.add_object(Object(c))

        # convert scripts into canvas objects
        # sort on line number seen
        for s in sorted(handler.scripts, key=lambda x: x.lineno):
            self.add_object(Object(s))

        # parse pykickstart packages
        packages = handler.packages

        meta['packages'] = {
            'default':
            packages.default,
            'exclude_docs':
            packages.excludeDocs,
            'no_base':
            not packages.addBase,
            'no_core':
            packages.nocore,
            'handle_missing':
            (packages.handleMissing == pykickstart.constants.KS_MISSING_IGNORE
             ),
            'install_langs':
            packages.instLangs,
            'multi_lib':
            packages.multiLib
        }

        if not packages.default:
            if packages.environment:
                meta['package']['environment'] = "@^{0}".format(
                    packages.environment)

            grps = packages.groupList
            grps.sort()
            for g in grps:
                self.add_package(Package({'n': g.__str__(), 'z': 1}))

            pkgs = packages.packageList
            pkgs.sort()
            for p in pkgs:
                self.add_package(Package({'n': p.__str__(), 'z': 1}))

            grps = packages.excludedGroupList
            grps.sort()
            for g in grps:
                self.add_package(Package({'n': g.__str__(), 'z': 0}))

            pkgs = packages.excludedList
            pkgs.sort()
            for p in pkgs:
                self.add_package(Package({'n': p.__str__(), 'z': 0}))

        self._meta['kickstart'] = meta
Esempio n. 29
0
 def test_repo_parse_dnf_invalid(self):
     with self.assertRaises(TypeError):
         Repository.parse_dnf("notvalid")
Esempio n. 30
0
 def test_repo_parse_dnf_invalid(self):
     with self.assertRaises(TypeError):
         Repository.parse_dnf("notvalid")
Esempio n. 31
0
    def run_push(self):
        t = Template(self.args.template, user=self.args.username)

        # grab the template we're pushing to
        try:
            t = self.cs.template_get(t)

        except ServiceException as e:
            logging.exception(e)
            return 1

        if self.args.push_clean:
            t.clear()

        if self.args.kickstart is not None:
            logging.info('Parsing kickstart ...')
            t.from_kickstart(self.args.kickstart)

        else:
            # prepare dnf
            logging.info('Analysing system ...')
            db = dnf.Base()
            db.read_all_repos()
            db.read_comps()

            try:
                db.fill_sack()

            except OSError as e:
                pass

            db_list = db.iter_userinstalled()

            if self.args.push_all:
                db_list = db.sack.query().installed()

            # add our user installed packages
            for p in db_list:
                # no need to store versions
                t.add_package(Package(p, evr=False))

            # add only enabled repos
            for r in db.repos.enabled():
                t.add_repo(Repository(r))

        objects = list(t.objects_delta)
        objects.sort(key=lambda x: x.name)

        packages = list(t.packages_delta)
        packages.sort(key=lambda x: x.name)

        repos = list(t.repos_delta)
        repos.sort(key=lambda x: x.name)

        # describe process for dry runs
        if self.args.dry_run:
            if len(packages) or len(repos):
                print(
                    'The following would be added to the template: {0}'.format(
                        t.name))

                for r in repos:
                    print('  - ' + str(r))

                for p in packages:
                    print('  - ' + str(p))

                for o in objects:
                    print('  - ' + str(o))

                print()
                print('Summary:')
                print('  - Repo(s): %d' % (len(repos)))
                print('  - Package(s): %d' % (len(packages)))
                print('  - Object(s): %d' % (len(objects)))
                print()

            else:
                print('No template changes required.')

            logging.info('No action peformed during this dry-run.')
            return 0

        if self.args.kickstart is None and not len(packages) and not len(
                repos):
            logging.info('No changes detected, template up to date.')
            return 0

        # push our updated template
        try:
            res = self.cs.template_update(t)

        except ServiceException as e:
            logging.exception(e)
            return 1

        logging.info('Template pushed.')
        return 0
Esempio n. 32
0
    def test_repo_parse_str_name(self):
        r1 = Repository('repo --name="Korora 23 - i386 - Updates"')

        # Name set
        self.assertEqual('Korora 23 - i386 - Updates', r1.name)
Esempio n. 33
0
 def test_package_parse_str_from_name(self):
     d1 = Repository.parse_str('validreponame')
     # Name set
     self.assertEqual('validreponame', d1['name'])