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
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
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
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))
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
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)