def get_image_metadata(self, image_id, datastore):
     metadata_path = os_metadata_path(datastore, image_id, IMAGE_FOLDER_NAME_PREFIX)
     self._logger.info("Loading metadata %s" % metadata_path)
     if os.path.exists(metadata_path):
         with open(metadata_path) as fh:
             try:
                 return json.load(fh)
             except ValueError:
                 self._logger.error("Error loading metadata file %s" % metadata_path, exc_info=True)
     return {}
 def get_image_metadata(self, image_id, datastore):
     metadata_path = os_metadata_path(datastore, image_id, IMAGE_FOLDER_NAME_PREFIX)
     self._logger.info("Loading metadata %s" % metadata_path)
     if os.path.exists(metadata_path):
         with open(metadata_path) as fh:
             try:
                 return json.load(fh)
             except ValueError:
                 self._logger.error("Error loading metadata file %s" % metadata_path, exc_info=True)
     return {}
Exemple #3
0
    def _copy_to_tmp_image(self, source_datastore, source_id, dest_datastore,
                           dest_id):
        """ Copy an image into a temp location.
            1. Lock a tmp image destination file with an exclusive lock. This
            is to prevent the GC thread from garbage collecting directories
            that are actively being used.
            The temp directory name contains a random UUID to prevent
            collisions with concurrent copies
            2. Create the temp directory.
            3. Copy the metadata file over.
            4. Copy the vmdk over.

            @return the tmp image directory on success.
        """
        ds_type = self._get_datastore_type(dest_datastore)
        if ds_type == DatastoreType.VSAN:
            tmp_image_dir = os_datastore_path(
                dest_datastore,
                compond_path_join(IMAGE_FOLDER_NAME_PREFIX, dest_id),
                compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX,
                                  str(uuid.uuid4())))
        else:
            tmp_image_dir = os_datastore_path(
                dest_datastore,
                compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX,
                                  str(uuid.uuid4())))

        # Create the temp directory
        self._host_client.make_directory(tmp_image_dir)

        # Copy the metadata file if it exists.
        source_meta = os_metadata_path(source_datastore, source_id,
                                       IMAGE_FOLDER_NAME_PREFIX)
        if os.path.exists(source_meta):
            try:
                dest_meta = os.path.join(tmp_image_dir,
                                         metadata_filename(dest_id))
                shutil.copy(source_meta, dest_meta)
            except:
                self._logger.exception("Failed to copy metadata file %s",
                                       source_meta)
                raise

        # Create the timestamp file
        self._create_image_timestamp_file(tmp_image_dir)

        self._host_client.copy_disk(
            vmdk_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX),
            os.path.join(tmp_image_dir, "%s.vmdk" % dest_id))
        return tmp_image_dir
    def _copy_to_tmp_image(self, source_datastore, source_id, dest_datastore, dest_id):
        """ Copy an image into a temp location.
            1. Lock a tmp image destination file with an exclusive lock. This
            is to prevent the GC thread from garbage collecting directories
            that are actively being used.
            The temp directory name contains a random UUID to prevent
            collisions with concurrent copies
            2. Create the temp directory.
            3. Copy the metadata file over.
            4. Copy the vmdk over.

            @return the tmp image directory on success.
        """
        ds_type = self._get_datastore_type(dest_datastore)
        if ds_type == DatastoreType.VSAN:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(IMAGE_FOLDER_NAME_PREFIX, dest_id),
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))
        else:
            tmp_image_dir = os_datastore_path(dest_datastore,
                                              compond_path_join(TMP_IMAGE_FOLDER_NAME_PREFIX, str(uuid.uuid4())))

        # Create the temp directory
        self._host_client.make_directory(tmp_image_dir)

        # Copy the metadata file if it exists.
        source_meta = os_metadata_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX)
        if os.path.exists(source_meta):
            try:
                dest_meta = os.path.join(tmp_image_dir, metadata_filename(dest_id))
                shutil.copy(source_meta, dest_meta)
            except:
                self._logger.exception("Failed to copy metadata file %s", source_meta)
                raise

        # Create the timestamp file
        self._create_image_timestamp_file(tmp_image_dir)

        self._host_client.copy_disk(vmdk_path(source_datastore, source_id, IMAGE_FOLDER_NAME_PREFIX),
                                    os.path.join(tmp_image_dir, "%s.vmdk" % dest_id))
        return tmp_image_dir