def reap_tmp_images(self): """ Clean up unused directories in the temp image folder. """ for ds in self._ds_manager.get_datastores(): for image_dir in list_top_level_directory(ds.id, TMP_IMAGE_FOLDER_NAME_PREFIX): if not os.path.isdir(image_dir): continue create_time = os.stat(image_dir).st_ctime current_time = time.time() if current_time - self.REAP_TMP_IMAGES_GRACE_PERIOD < create_time: # Skip folders that are newly created in past x minutes # For example, during host-to-host transfer, hostd on # receiving end stores the uploaded file in temp images # folder but does not lock it with FileBackedLock, so we # need to allow a grace period before reaping it. self._logger.info("Skip folder: %s, created: %s, now: %s" % (image_dir, create_time, current_time)) continue try: with FileBackedLock(image_dir, ds.type): if os.path.exists(image_dir): self._logger.info("Delete folder %s" % image_dir) shutil.rmtree(image_dir, ignore_errors=True) except (AcquireLockFailure, InvalidFile): self._logger.info("Already locked: %s, skipping" % image_dir) except: self._logger.info("Unable to remove %s" % image_dir, exc_info=True)
def get_images(self, datastore): """ Get image list from datastore :param datastore: datastore id :return: list of string, image id list """ image_ids = [] if not os.path.exists(os_datastore_root(datastore)): raise DatastoreNotFoundException() # image_folder is /vmfs/volumes/${datastore}/images_* for dir in list_top_level_directory(datastore, IMAGE_FOLDER_NAME_PREFIX): image_id = dir.split(COMPOND_PATH_SEPARATOR)[1] if self.check_image(image_id, datastore): image_ids.append(image_id) return image_ids
def _list_top_level_directory(self, datastore, folder_prefix): return list_top_level_directory(datastore, folder_prefix)