Beispiel #1
0
    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': []
            })
Beispiel #2
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

        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
Beispiel #3
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
Beispiel #4
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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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)
Beispiel #9
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', {})
Beispiel #10
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