/** * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::copyBlob * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::createBlobSnapshot * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::createPageBlob * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::deleteBlob * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::getBlob * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::listBlobs * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::setBlobMetadata */ private function copyBlobWorker($options, $sourceContainer, $destContainer) { $sourceBlob = BlobServiceFunctionalTestData::getInterestingBlobName($sourceContainer); $destBlob = BlobServiceFunctionalTestData::getInterestingBlobName($destContainer); // Make sure there is something to test $sourceDataSize = 512; $this->restProxy->createPageBlob($sourceContainer, $sourceBlob, $sourceDataSize); $destDataSize = 2048; $destBlobInfo = $this->restProxy->createPageBlob($destContainer, $destBlob, $destDataSize); $this->restProxy->createBlobSnapshot($destContainer, $destBlob); $metadata = BlobServiceFunctionalTestData::getNiceMetadata(); $this->restProxy->setBlobMetadata($sourceContainer, $sourceBlob, $metadata); $snapshot = $this->restProxy->createBlobSnapshot($sourceContainer, $sourceBlob); if (!is_null($options)) { BlobServiceFunctionalTestData::fixETagAccessCondition($options->getSourceAccessCondition(), $snapshot->getETag()); BlobServiceFunctionalTestData::fixETagAccessCondition($options->getAccessCondition(), $destBlobInfo->getETag()); $options->setSourceSnapshot(is_null($options->getSourceSnapshot()) ? null : $snapshot->getSnapshot()); } try { if (is_null($options)) { $this->restProxy->copyBlob($destContainer, $destBlob, $sourceContainer, $sourceBlob); } else { $this->restProxy->copyBlob($destContainer, $destBlob, $sourceContainer, $sourceBlob, $options); } if (is_null($options)) { $options = new CopyBlobOptions(); } if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) { $this->assertTrue(false, 'Expect negative timeouts in $options to throw'); } if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) { $this->assertTrue(false, 'Expect failing source temporal access condition should throw'); } if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) { $this->assertTrue(false, 'Expect failing source etag access condition to throw'); } if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) { $this->assertTrue(false, 'Expect failing dest temporal access condition should throw'); } if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) { $this->assertTrue(false, 'Expect failing dest etag access condition to throw'); } $listOptions = new ListBlobsOptions(); $listOptions->setIncludeSnapshots(true); $listOptions->setPrefix($destBlob); $listBlobsResult = $this->restProxy->listBlobs($destContainer == '' ? '$root' : $destContainer, $listOptions); $blobs = $listBlobsResult->getBlobs(); $getBlobResult = $this->restProxy->getBlob($destContainer, $destBlob); $this->verifyCopyBlobWorker($options, $blobs, $getBlobResult, $sourceDataSize, $metadata); } catch (ServiceException $e) { if (is_null($options)) { $options = new CopyBlobOptions(); } if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) { $this->assertEquals(500, $e->getCode(), 'bad timeout: deleteHttpStatusCode'); } else { if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) { $this->assertEquals(412, $e->getCode(), 'bad source temporal access condition IF_UNMODIFIED_SINCE: deleteHttpStatusCode'); } else { if (!BlobServiceFunctionalTestData::passETagAccessCondition($options->getSourceAccessCondition())) { $this->assertEquals(412, $e->getCode(), 'bad source etag access condition: deleteHttpStatusCode'); } else { if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) { $this->assertEquals(412, $e->getCode(), 'bad dest temporal access condition IF_UNMODIFIED_SINCE: deleteHttpStatusCode'); } else { if (!BlobServiceFunctionalTestData::passETagAccessCondition($options->getAccessCondition())) { $this->assertEquals(412, $e->getCode(), 'bad dest etag access condition: deleteHttpStatusCode'); } else { throw $e; } } } } } } // Clean up. $this->restProxy->deleteBlob($sourceContainer, $sourceBlob); $this->restProxy->deleteBlob($destContainer, $destBlob); }
/** * @covers MicrosoftAzure\Storage\Blob\Models\CopyBlobOptions::setSourceLeaseId * @covers MicrosoftAzure\Storage\Blob\Models\CopyBlobOptions::getSourceLeaseId */ public function testSetSourceLeaseId() { $expected = '0x8CAFB82EFF70C46'; $options = new CopyBlobOptions(); $options->setSourceLeaseId($expected); $this->assertEquals($expected, $options->getSourceLeaseId()); }
public static function getCopyBlobOptions() { $ret = array(); $options = new CopyBlobOptions(); array_push($ret, $options); $options = new CopyBlobOptions(); $options->setTimeout(10); array_push($ret, $options); $options = new CopyBlobOptions(); $options->setTimeout(-10); array_push($ret, $options); foreach (self::getAllAccessConditions() as $ac) { $options = new CopyBlobOptions(); $options->setSourceAccessCondition($ac); array_push($ret, $options); } foreach (self::getAllAccessConditions() as $ac) { $options = new CopyBlobOptions(); $options->setAccessCondition($ac); array_push($ret, $options); } $options = new CopyBlobOptions(); $metadata = array('Xkey' => 'Avalue', 'Yfoo' => 'Bbar', 'Zbaz' => 'Cboo'); $options->setMetadata($metadata); array_push($ret, $options); $options = new CopyBlobOptions(); $options->setSourceSnapshot('placeholder'); array_push($ret, $options); // TODO: Handle Lease ID // $options = new CopyBlobOptions(); // $options->setLeaseId('setLeaseId'); // array_push($ret, $options); // // $options = new CopyBlobOptions(); // $options->setSourceLeaseId('setSourceLeaseId'); // array_push($ret, $options); return $ret; }
/** * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::copyBlob * @covers MicrosoftAzure\Storage\Blob\BlobRestProxy::_getCopyBlobSourceName */ public function testCopyBlobSnapshot() { // Setup $containerName = 'copyblobsnapshot' . $this->createSuffix(); $sourceBlobName = 'sourceblob'; $blobValue = 'testBlobValue'; $destinationBlobName = 'destinationblob'; $this->createContainer($containerName); $this->restProxy->createBlockBlob($containerName, $sourceBlobName, $blobValue); $snapshotResult = $this->restProxy->createBlobSnapshot($containerName, $sourceBlobName); $options = new CopyBlobOptions(); $options->setSourceSnapshot($snapshotResult->getSnapshot()); // Test $this->restProxy->copyBlob($containerName, $destinationBlobName, $containerName, $sourceBlobName, $options); // Assert $sourceBlob = $this->restProxy->getBlob($containerName, $sourceBlobName); $destinationBlob = $this->restProxy->getBlob($containerName, $destinationBlobName); $sourceBlobContent = stream_get_contents($sourceBlob->getContentStream()); $destinationBlobContent = stream_get_contents($destinationBlob->getContentStream()); $this->assertEquals($sourceBlobContent, $destinationBlobContent); }
/** * Copies a source blob to a destination blob within the same storage account. * * @param string $destinationContainer name of the destination * container * @param string $destinationBlob name of the destination * blob * @param string $sourceContainer name of the source * container * @param string $sourceBlob name of the source * blob * @param Models\CopyBlobOptions $options optional parameters * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx */ public function copyBlob($destinationContainer, $destinationBlob, $sourceContainer, $sourceBlob, $options = null) { $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $destinationBlobPath = $this->_createPath($destinationContainer, $destinationBlob); $statusCode = Resources::STATUS_ACCEPTED; if (is_null($options)) { $options = new CopyBlobOptions(); } $this->addOptionalQueryParam($queryParams, Resources::QP_TIMEOUT, $options->getTimeout()); $sourceBlobPath = $this->_getCopyBlobSourceName($sourceContainer, $sourceBlob, $options); $headers = $this->addOptionalAccessConditionHeader($headers, $options->getAccessCondition()); $headers = $this->addOptionalSourceAccessConditionHeader($headers, $options->getSourceAccessCondition()); $this->addOptionalHeader($headers, Resources::X_MS_COPY_SOURCE, $sourceBlobPath); $headers = $this->addMetadataHeaders($headers, $options->getMetadata()); $this->addOptionalHeader($headers, Resources::X_MS_LEASE_ID, $options->getLeaseId()); $this->addOptionalHeader($headers, Resources::X_MS_SOURCE_LEASE_ID, $options->getSourceLeaseId()); $response = $this->send($method, $headers, $queryParams, $postParams, $destinationBlobPath, $statusCode); return CopyBlobResult::create(HttpFormatter::formatHeaders($response->getHeaders())); }
/** * Gets the copy blob source name with specified parameters. * * @param string $containerName The name of the container. * @param string $blobName The name of the blob. * @param Models\CopyBlobOptions $options The optional parameters. * * @return string */ private function _getCopyBlobSourceName($containerName, $blobName, $options) { $sourceName = $this->_getBlobUrl($containerName, $blobName); if (!is_null($options->getSourceSnapshot())) { $sourceName .= '?snapshot=' . $options->getSourceSnapshot(); } return $sourceName; }