def get_container_details(cont_path): """ get container details by traversing the filesystem """ bytes_used = 0 object_count = 0 obj_list = [] if os_path.isdir(cont_path): for (path, dirs, files) in do_walk(cont_path): object_count, bytes_used = update_list(path, cont_path, dirs, files, object_count, bytes_used, obj_list) sleep() return obj_list, object_count, bytes_used
def get_container_details(cont_path): """ get container details by traversing the filesystem """ bytes_used = 0 object_count = 0 obj_list = [] if do_isdir(cont_path): for (path, dirs, files) in do_walk(cont_path): object_count, bytes_used = update_list(path, cont_path, dirs, files, object_count, bytes_used, obj_list) sleep() return obj_list, object_count, bytes_used
def test_do_walk(self): # create directory structure tmpparent = mkdtemp() try: tmpdirs = [] tmpfiles = [] for i in range(5): tmpdirs.append(mkdtemp(dir=tmpparent).rsplit(os.path.sep, 1)[1]) tmpfiles.append(mkstemp(dir=tmpparent)[1].rsplit(os.path.sep, \ 1)[1]) for path, dirnames, filenames in fs.do_walk(tmpparent): assert path == tmpparent assert dirnames.sort() == tmpdirs.sort() assert filenames.sort() == tmpfiles.sort() break finally: shutil.rmtree(tmpparent)
def _get_container_details_from_fs(cont_path): """ get container details by traversing the filesystem """ bytes_used = 0 object_count = 0 obj_list = [] dir_list = [] if os_path.isdir(cont_path): for (path, dirs, files) in do_walk(cont_path): object_count, bytes_used = update_list(path, cont_path, dirs, files, object_count, bytes_used, obj_list) dir_list.append((path, do_stat(path).st_mtime)) sleep() return ContainerDetails(bytes_used, object_count, obj_list, dir_list)
def rmobjdir(dir_path): """ Removes the directory as long as there are no objects stored in it. This works for containers also. """ try: if dir_empty(dir_path): rmdirs(dir_path) return True except FileOrDirNotFoundError: # No such directory exists return False for (path, dirs, files) in do_walk(dir_path, topdown=False): for directory in dirs: fullpath = os.path.join(path, directory) metadata = read_metadata(fullpath) if not dir_is_object(metadata): # Directory is not an object created by the caller # so we can go ahead and delete it. try: if dir_empty(fullpath): rmdirs(fullpath) else: # Non-object dir is not empty! return False except FileOrDirNotFoundError: # No such dir! return False else: # Wait, this is an object created by the caller # We cannot delete return False rmdirs(dir_path) return True
def rmobjdir(dir_path): """ Removes the directory as long as there are no objects stored in it. This works for containers also. """ try: do_rmdir(dir_path) except OSError as err: if err.errno == errno.ENOENT: # No such directory exists return False if err.errno != errno.ENOTEMPTY: raise # Handle this non-empty directories below. else: return True # We have a directory that is not empty, walk it to see if it is filled # with empty sub-directories that are not user created objects # (gratuitously created as a result of other object creations). for (path, dirs, files) in do_walk(dir_path, topdown=False): for directory in dirs: fullpath = os.path.join(path, directory) try: metadata = read_metadata(fullpath) except OSError as err: if err.errno == errno.ENOENT: # Ignore removal from another entity. continue raise else: if dir_is_object(metadata): # Wait, this is an object created by the caller # We cannot delete return False # Directory is not an object created by the caller # so we can go ahead and delete it. try: do_rmdir(fullpath) except OSError as err: if err.errno == errno.ENOTEMPTY: # Directory is not empty, it might have objects in it return False if err.errno == errno.ENOENT: # No such directory exists, already removed, ignore continue raise try: do_rmdir(dir_path) except OSError as err: if err.errno == errno.ENOTEMPTY: # Directory is not empty, race with object creation return False if err.errno == errno.ENOENT: # No such directory exists, already removed, ignore return True raise else: return True