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')
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)
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')
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')
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)
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)
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)
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)
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)
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)
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')
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)
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')
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)
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)
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)
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}' )
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' )
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)
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)
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
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', {})
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
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
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)
def test_package_parse_str_from_name(self): d1 = Repository.parse_str('validreponame') # Name set self.assertEqual('validreponame', d1['name'])
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
def test_repo_parse_dnf_invalid(self): with self.assertRaises(TypeError): Repository.parse_dnf("notvalid")
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
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)