putSnapshotBlock method
Writes a block of data to a snapshot. If the specified block contains
data, the existing data is overwritten. The target snapshot must be in the
pending
state.
Data written to a snapshot must be aligned with 512-byte sectors.
May throw AccessDeniedException. May throw ValidationException. May throw ResourceNotFoundException. May throw RequestThrottledException. May throw ServiceQuotaExceededException. May throw InternalServerException.
Parameter blockData
:
The data to write to the block.
The block data is not signed as part of the Signature Version 4 signing process. As a result, you must generate and provide a Base64-encoded SHA256 checksum for the block data using the x-amz-Checksum header. Also, you must specify the checksum algorithm using the x-amz-Checksum-Algorithm header. The checksum that you provide is part of the Signature Version 4 signing process. It is validated against a checksum generated by Amazon EBS to ensure the validity and authenticity of the data. If the checksums do not correspond, the request fails. For more information, see Using checksums with the EBS direct APIs in the Amazon Elastic Compute Cloud User Guide.
Parameter blockIndex
:
The block index of the block in which to write the data. A block index is
a logical index in units of 512
KiB blocks. To identify the
block index, divide the logical offset of the data in the logical volume
by the block size (logical offset of data/524288
). The
logical offset of the data must be 512
KiB aligned.
Parameter checksum
:
A Base64-encoded SHA256 checksum of the data. Only SHA256 checksums are
supported.
Parameter checksumAlgorithm
:
The algorithm used to generate the checksum. Currently, the only supported
algorithm is SHA256
.
Parameter dataLength
:
The size of the data to write to the block, in bytes. Currently, the only
supported size is 524288
.
Valid values: 524288
Parameter snapshotId
:
The ID of the snapshot.
Parameter progress
:
The progress of the write process, as a percentage.
Implementation
Future<PutSnapshotBlockResponse> putSnapshotBlock({
required Uint8List blockData,
required int blockIndex,
required String checksum,
required ChecksumAlgorithm checksumAlgorithm,
required int dataLength,
required String snapshotId,
int? progress,
}) async {
ArgumentError.checkNotNull(blockData, 'blockData');
ArgumentError.checkNotNull(blockIndex, 'blockIndex');
_s.validateNumRange(
'blockIndex',
blockIndex,
0,
1152921504606846976,
isRequired: true,
);
ArgumentError.checkNotNull(checksum, 'checksum');
_s.validateStringLength(
'checksum',
checksum,
0,
64,
isRequired: true,
);
ArgumentError.checkNotNull(checksumAlgorithm, 'checksumAlgorithm');
ArgumentError.checkNotNull(dataLength, 'dataLength');
ArgumentError.checkNotNull(snapshotId, 'snapshotId');
_s.validateStringLength(
'snapshotId',
snapshotId,
1,
64,
isRequired: true,
);
_s.validateNumRange(
'progress',
progress,
0,
100,
);
final headers = <String, String>{
'x-amz-Checksum': checksum.toString(),
'x-amz-Checksum-Algorithm': checksumAlgorithm.toValue(),
'x-amz-Data-Length': dataLength.toString(),
if (progress != null) 'x-amz-Progress': progress.toString(),
};
final response = await _protocol.sendRaw(
payload: blockData,
method: 'PUT',
requestUri:
'/snapshots/${Uri.encodeComponent(snapshotId)}/blocks/${Uri.encodeComponent(blockIndex.toString())}',
headers: headers,
exceptionFnMap: _exceptionFns,
);
final $json = await _s.jsonFromResponse(response);
return PutSnapshotBlockResponse(
checksum: _s.extractHeaderStringValue(response.headers, 'x-amz-Checksum'),
checksumAlgorithm: _s
.extractHeaderStringValue(
response.headers, 'x-amz-Checksum-Algorithm')
?.toChecksumAlgorithm(),
);
}