if isinstance(line, unicode): line = line.encode('utf-8') metadata[i] = line metadata = [i + '\n' for i in metadata] tmpFilePath = self._metafile + ".new" try: self._oop.writeLines(tmpFilePath, metadata) except IOError as e: if e.errno != errno.ESTALE: raise self._oop.writeLines(tmpFilePath, metadata) self._oop.os.rename(tmpFilePath, self._metafile) FileSDMetadata = lambda metafile: DictValidator( PersistentDict(FileMetadataRW(metafile)), FILE_SD_MD_FIELDS) class FileStorageDomain(sd.StorageDomain): def __init__(self, domainPath): # Using glob might look like the simplest thing to do but it isn't # If one of the mounts is stuck it'll cause the entire glob to fail # and you wouldn't be able to access any domain self.log.debug("Reading domain in path %s", domainPath) self.mountpoint = os.path.dirname(domainPath) self.remotePath = os.path.basename(self.mountpoint) self.metafile = os.path.join(domainPath, sd.DOMAIN_META_DATA, sd.METADATA) sdUUID = os.path.basename(domainPath) validateFileSystemFeatures(sdUUID, self.mountpoint)
metaStr.write(line) metaStr.write("\n") if metaStr.pos > self._size: raise se.MetadataOverflowError() # Clear out previous data - it is a volume, not a file metaStr.write('\0' * (self._size - metaStr.pos)) data = metaStr.getvalue() with fileUtils.DirectFile(self.metavol, "r+d") as f: f.seek(self._offset) f.write(data) LvBasedSDMetadata = lambda vg, lv: DictValidator( PersistentDict(LvMetadataRW(vg, lv, 0, SD_METADATA_SIZE)), BLOCK_SD_MD_FIELDS) TagBasedSDMetadata = lambda vg: DictValidator( PersistentDict(VGTagMetadataRW(vg)), BLOCK_SD_MD_FIELDS) def selectMetadata(sdUUID): mdProvider = LvBasedSDMetadata(sdUUID, sd.METADATA) if len(mdProvider) > 0: metadata = mdProvider else: metadata = TagBasedSDMetadata(sdUUID) return metadata
def _getPoolMD(cls, domain): # This might look disgusting but this makes it so that # This is the only intrusion needed to satisfy the # unholy union between pool and SD metadata return DictValidator(domain._metadata._dict, SP_MD_FIELDS)