def addSoftwareProfile( self, session: Session, softwareProfile: SoftwareProfile) -> SoftwareProfileModel: """ Insert software profile into the db. Raises: SoftwareProfileAlreadyExists DbError """ try: try: dbSoftwareProfile = self._softwareProfilesDbHandler.\ getSoftwareProfile( session, softwareProfile.getName()) raise SoftwareProfileAlreadyExists( 'Software profile [%s] already exists' % (softwareProfile)) except SoftwareProfileNotFound as ex: pass dbSoftwareProfile = self.__populateSoftwareProfile( session, softwareProfile) session.query(func.max(SoftwareProfileModel.id)).one() softwareProfile.setId(dbSoftwareProfile.id) self._logger.info('Added software profile [%s]' % (dbSoftwareProfile.name)) return dbSoftwareProfile except TortugaException: session.rollback() raise except Exception as ex: session.rollback() self._logger.exception(str(ex)) raise
def __populateSoftwareProfile( self, session: Session, softwareProfile: SoftwareProfile, dbSoftwareProfile: Optional[SoftwareProfileModel] = None) \ -> SoftwareProfileModel: """ Helper function for creating/updating dbSoftwareProfile Object """ # Validate object if softwareProfile.getName() is None: raise UpdateSoftwareProfileFailed('Software profile name required') if softwareProfile.getType() is None: raise UpdateSoftwareProfileFailed( 'Software profile must have valid type') osInfo = softwareProfile.getOsInfo() if osInfo is None or osInfo.getName() is None: raise UpdateSoftwareProfileFailed( 'Software profile must have valid operating system') if dbSoftwareProfile is None: dbSoftwareProfile = SoftwareProfileModel() dbOs = self._osDbHandler.addOsIfNotFound(session, osInfo) dbSoftwareProfile.name = softwareProfile.getName() dbSoftwareProfile.description = softwareProfile.getDescription() dbSoftwareProfile.kernel = softwareProfile.getKernel() dbSoftwareProfile.kernelParams = softwareProfile.getKernelParams() dbSoftwareProfile.initrd = softwareProfile.getInitrd() dbSoftwareProfile.os = dbOs dbSoftwareProfile.type = softwareProfile.getType() dbSoftwareProfile.minNodes = softwareProfile.getMinNodes() dbSoftwareProfile.maxNodes = softwareProfile.getMaxNodes() dbSoftwareProfile.lockedState = softwareProfile.getLockedState() dbSoftwareProfile.dataRoot = softwareProfile.getDataRoot() dbSoftwareProfile.dataRsync = softwareProfile.getDataRsync() # Add partitions partitions: Dict[Tuple[str, str], Partition] = {} for partition in softwareProfile.getPartitions(): # This is a new partition dbPartition = PartitionModel() dbPartition.name = partition.getName() dbPartition.device = partition.getDevice() dbPartition.mountPoint = partition.getMountPoint() dbPartition.fsType = partition.getFsType() dbPartition.size = partition.getSize() dbPartition.options = partition.getOptions() dbPartition.preserve = partition.getPreserve() dbPartition.bootLoader = partition.getBootLoader() dbPartition.diskSize = partition.getDiskSize() dbPartition.directAttachment = partition.getDirectAttachment() dbPartition.indirectAttachment = partition.\ getIndirectAttachment() dbPartition.sanVolume = partition.getSanVolume() if not dbPartition.name: raise InvalidPartitionScheme( 'Invalid partition in software profile:' ' missing or empty name') if not dbPartition.device: raise InvalidPartitionScheme( 'Invalid partition in software profile:' ' missing or empty device') if not dbPartition.fsType: raise InvalidPartitionScheme( 'Invalid partition [%s/%s] in software profile:' ' missing or empty fsType' % (dbPartition.name, dbPartition.device)) if dbPartition.size is None: raise InvalidPartitionScheme( 'Invalid partition [%s/%s] in software profile:' ' missing size' % (dbPartition.name, dbPartition.device)) if partitions.get( (dbPartition.name, dbPartition.device)) is not None: # Duplicate partition ...error raise UpdateSoftwareProfileFailed( 'Duplicate partition [%s/%s] found' % (dbPartition.name, dbPartition.device)) try: int(dbPartition.size) except ValueError: raise InvalidPartitionScheme( 'Invalid partition [%s/%s] in software profile:' ' non-integer size' % (dbPartition.name, dbPartition.device)) try: if dbPartition.diskSize is not None: int(dbPartition.diskSize) except ValueError: raise InvalidPartitionScheme( 'Invalid partition [%s/%s] in software profile:' ' non-integer disk size' % (dbPartition.name, dbPartition.device)) bGrow = partition.getGrow() if bGrow is not None: dbPartition.grow = bGrow maxSize = partition.getMaxSize() if maxSize is not None: dbPartition.maxSize = maxSize partitions[(dbPartition.name, dbPartition.device)] = \ dbPartition # Delete out the old ones dbSoftwareProfile.partitions = [] session.flush() dbSoftwareProfile.partitions = list(partitions.values()) self._set_tags(dbSoftwareProfile, softwareProfile.getTags()) session.add(dbSoftwareProfile) session.flush() return dbSoftwareProfile