def test_object_parse_invalid(self): # checksum must match if set with self.assertRaises(ErrorInvalidObject): Object({'name': 'foo', 'checksum': {'sha256': ''}, 'actions': []}) with self.assertRaises(ErrorInvalidObject): Object({ 'name': 'foo', 'data': 'abc', 'checksum': { 'sha256': '' }, 'actions': [] })
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 try: obj = Object(name=self.args.object, data=self.args.data, data_file=self.args.data_file, source=self.args.source, xsum=self.args.xsum, actions=self.args.actions) except ErrorInvalidObject as e: print (e) return 1 t.add_object(obj) # describe process for dry runs if self.args.dry_run: print('The following object would be added to the template: {0}'.format(t.name)) print(' - ' + str(obj)) print() return 1 # push our updated template try: res = self.cs.template_update(t) except ServiceException as e: print(e) return 1 return 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 for o in self.args.objects: try: obj = Object(name=o) except ErrorInvalidObject as e: print (e) return 1 t.remove_object(obj) if self.args.dry_run: # TODO: print changes return 1 # push our updated template try: res = self.cs.template_update(t) except ServiceException as e: print(e) return 1 return 0
def test_object_parse_empty(self): o1 = Object({}) self.assertEqual(None, o1.name) self.assertEqual(None, o1.data) self.assertEqual(None, o1.xsum) self.assertEqual([], o1.actions)
def test_objectset_uniqueness(self): o1 = Object({ 'name': 'foo', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o2 = Object({ 'name': 'bar', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o3 = Object({ 'name': 'baz', 'data': 'xyz', 'checksum': { 'sha256': '3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282' }, 'actions': [] }) l1 = ObjectSet() l1.add(o1) self.assertTrue(len(l1) == 1) # adding second object of same checksum should overwrite # existing object with undefined arch l1.add(o2) self.assertTrue(len(l1) == 1) self.assertTrue(ObjectSet([o2]), l1) l1.add(o3) self.assertTrue(len(l1) == 2) self.assertTrue(ObjectSet([o2, o3]), l1)
def test_objectset_update(self): o1 = Object({ 'name': 'foo', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o2 = Object({ 'name': 'bar', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o3 = Object({ 'name': 'baz', 'data': 'xyz', 'checksum': { 'sha256': '3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282' }, 'actions': [] }) l1 = ObjectSet() l2 = ObjectSet() l1.add(o2) l1.add(o3) self.assertEqual(ObjectSet([o2, o3]), l1) l2.add(o1) self.assertEqual(ObjectSet([o1]), l2) l2.update(l1) self.assertEqual(ObjectSet([o2, o3]), l2)
def test_objectset_difference(self): o1 = Object({ 'name': 'foo', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o2 = Object({ 'name': 'bar', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) o3 = Object({ 'name': 'baz', 'data': 'xyz', 'checksum': { 'sha256': '3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282' }, 'actions': [] }) l1 = ObjectSet([o1, o3]) l2 = ObjectSet([o2]) (luniq1, luniq2) = l1.difference(l2) self.assertEqual(ObjectSet([o3]), luniq1) self.assertEqual(ObjectSet([]), luniq2)
def test_object_parse_dict(self): o1 = Object({ 'name': 'foo', 'data': 'abc', 'checksum': { 'sha256': 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' }, 'actions': [] }) self.assertEqual('foo', o1.name) self.assertEqual('abc', o1.data) self.assertEqual( 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', o1.xsum) self.assertEqual([], o1.actions)
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 _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