Example #1
0
    def _create_kit_db_entry(self, session: Session, kit) -> Kit:
        """
        Creates a database entry for a kit.

        :param kit:
        :return: a Kit instance (TortugaObject)

        """
        try:
            return self._kit_db_api.getKit(session, kit['name'], kit['ver'])
        except KitNotFound:
            pass

        # Add the database entries for the kit
        kitObj = Kit(name=kit['name'], version=kit['ver'], iteration='0')
        kitObj.setDescription(kit['sum'])
        kitObj.setIsOs(True)
        kitObj.setIsRemovable(True)

        kit_descr = format_kit_descriptor(kit['name'], kit['ver'], kit['arch'])

        newComp = Component(name=kit_descr, version=kit['ver'])

        newComp.setDescription('%s mock component' % (kit_descr))

        newComp.addOsInfo(
            osHelper.getOsInfo(kit['name'], kit['ver'], kit['arch']))

        kitObj.addComponent(newComp)

        # Kit does not previously exist, perform 'normal' add kit operation
        self._kit_db_api.addKit(session, kitObj)

        return kitObj
Example #2
0
    def _checkExistingKit(self, session: Session, kitname: str,
                          kitversion: str, kitarch: str):
        """
        Raises:
            KitAlreadyExists
        """

        try:
            kit = self._kit_db_api.getKit(session, kitname, kitversion)

            longname = format_kit_descriptor(kitname, kitversion, kitarch)

            # Attempt to get matching OS component
            for c in kit.getComponentList(session):
                if c.getName() != longname:
                    continue

                for cOs in c.getOsInfoList():
                    if cOs == OsInfo(kitname, kitversion, kitarch):
                        raise KitAlreadyExists(
                            "OS kit [%s] already installed" % longname)

            # Kit exists, but doesn't have a matching os component
        except KitNotFound:
            pass
Example #3
0
    def addKit(self, session: Session, kit):
        """
        Insert kit into the db.

        Raises:
            KitAlreadyExists
            DbError
        """

        try:
            dbKit = self._kitsDbHandler.addKit(session, kit)

            session.commit()

            iteration = dbKit.components[0].os_components[0].os.arch \
                if dbKit.isOs else dbKit.iteration

            kit_descr = format_kit_descriptor(
                dbKit.name, dbKit.version, iteration)

            logmsg = 'Installed OS kit [{0}] successfully' \
                if dbKit.isOs else 'Installed kit [{0}] successfully'

            self._logger.info(logmsg.format(kit_descr))
        except TortugaException:
            session.rollback()

            raise
        except Exception as ex:
            session.rollback()

            self._logger.exception(str(ex))

            raise
Example #4
0
    def deleteKit(self, session, name, version, iteration, force=False):
        """
        Delete kit from the db.

        Raises:
            KitNotFound
        """

        dbKit = self.getKit(session, name, version, iteration)

        # Check if kit exists, and whether it is being used.
        self.getLogger().debug('Deleting kit [%s]' % (format_kit_descriptor(
            dbKit.name, dbKit.version, dbKit.iteration)))

        installer = ConfigManager().getInstaller()

        for dbComponent in dbKit.components:
            if not force and dbComponent.softwareprofiles:
                softwareProfileList = [
                    dbSoftwareProfile.name
                    for dbSoftwareProfile in dbComponent.softwareprofiles
                ]

                # If the component is associated with only one software
                # profile and that software profile contains the
                # installer node, the kit can be safely removed.
                if not (dbKit.isOs and len(softwareProfileList) == 1
                        and dbComponent.softwareprofiles[0].nodes
                        and dbComponent.softwareprofiles[0].nodes[0].name
                        == installer):
                    raise KitInUse(
                        'Kit cannot be deleted.  Component [%s] from'
                        ' kit [%s] is in use by software profile(s):'
                        ' [%s]' %
                        (dbComponent.name,
                         format_kit_descriptor(
                             dbKit.name, dbKit.version,
                             dbKit.iteration), ' '.join(softwareProfileList)))

        session.delete(dbKit)

        self.getLogger().debug('Marking kit [%s] for deletion' % (dbKit.name))
Example #5
0
    def prepareOSKit(self, srcPath):
        version = self.osdistro.version \
            if not self.mirror else self.osdistro.version.split('.', 1)[0]

        kit = {
            'ver': version,
            'arch': self.osdistro.arch,
            'name': self.osdistro.ostype,
        }

        kit_descr = format_kit_descriptor(kit['name'], kit['ver'], kit['arch'])

        kit['sum'] = 'OS kit for %s %s' % (kit['name'], kit['ver'])
        kit['initrd'] = 'initrd-%s.img' % (kit_descr)
        kit['kernel'] = 'kernel-%s' % (kit_descr)

        # Copy kernel & initrd to pxedir
        if not os.path.exists(self.pxeboot_dir):
            os.makedirs(self.pxeboot_dir)

        bmt = BootMediaTool(srcPath)

        # Check whether this is disc 1.
        if bmt.getKernelPath() is None or bmt.getInitrdPath() is None:
            raise UnrecognizedKitMedia("Please supply disc 1 first!")

        try:
            bmt.copyInitrd(os.path.join(self.pxeboot_dir, kit['initrd']), True)

            # copy kernel to standardized name
            bmt.copyKernel(os.path.join(self.pxeboot_dir, kit['kernel']), True)
        except (CopyError, FileAlreadyExists, IOError) as exc:
            # cleanup tmp stuff

            self.logger.error(
                'Error copying initrd and/or kernel from OS media'
                ' (exception=[%s])' % (exc))

            # consider the kernel/initrd invalidated, remove them
            removeFile(os.path.join(self.pxeboot_dir, kit['kernel']))
            removeFile(os.path.join(self.pxeboot_dir, kit['initrd']))

            raise

        self.kit = kit

        return kit
Example #6
0
def expandVars(actionCommand):
    kit = [kit for kit in KitApi().getKitList()
           if kit.getName() == 'simple_policy_engine']

    if not kit:
        # This cannot happen but handle it anyway...
        return actionCommand

    ddict = {
        'spe_kitdir': os.path.join(
            ConfigManager().getKitDir(),
            'kit-{0}'.format(
                format_kit_descriptor(kit[0].getName(),
                                      kit[0].getVersion(),
                                      kit[0].getIteration()))),
    }

    return Template(actionCommand).render(ddict)