From 31ad0936b55901df4981ba05a8719ce0af4fff2d Mon Sep 17 00:00:00 2001 From: ljbreak2008 Date: Wed, 3 Jan 2018 10:19:47 +0800 Subject: [PATCH 1/3] restore dev --- src/OSS/Core/OssUtil.php | 13 +++ src/OSS/OssClient.php | 30 ++++++- tests/OSS/Tests/OssClientBucketTest.php | 44 ++++++++++ .../OSS/Tests/OssClientRestoreObjectTest.php | 87 +++++++++++++++++++ 4 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 tests/OSS/Tests/OssClientRestoreObjectTest.php diff --git a/src/OSS/Core/OssUtil.php b/src/OSS/Core/OssUtil.php index b70680ee..6e5d4133 100644 --- a/src/OSS/Core/OssUtil.php +++ b/src/OSS/Core/OssUtil.php @@ -170,6 +170,19 @@ public static function startsWith($str, $findMe) } } + /** + * 生成createBucketXmlBody接口的xml消息 + * + * @param string $storageClass + * @return string + */ + public static function createBucketXmlBody($storageClass) + { + $xml = new \SimpleXMLElement(''); + $xml->addChild('StorageClass', $storageClass); + return $xml->asXML(); + } + /** * 检验$options * diff --git a/src/OSS/OssClient.php b/src/OSS/OssClient.php index 34cfb0bd..9d9605ac 100644 --- a/src/OSS/OssClient.php +++ b/src/OSS/OssClient.php @@ -131,15 +131,17 @@ public function listBuckets($options = NULL) * @param string $bucket * @param string $acl * @param array $options + * @param string $storageType * @return null */ - public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL) + public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL, $storageType = self::OSS_STORAGE_TYPE_STANDARD) { $this->precheckCommon($bucket, NULL, $options, false); $options[self::OSS_BUCKET] = $bucket; $options[self::OSS_METHOD] = self::OSS_HTTP_PUT; $options[self::OSS_OBJECT] = '/'; $options[self::OSS_HEADERS] = array(self::OSS_ACL => $acl); + $options[self::OSS_CONTENT] = OssUtil::createBucketXmlBody($storageType); $response = $this->auth($options); $result = new PutSetDeleteResult($response); return $result->getData(); @@ -1412,6 +1414,27 @@ public function doesObjectExist($bucket, $object, $options = NULL) return $result->getData(); } + /** + * 针对Archive类型的Object读取 + * 需要使用Restore操作让服务端执行解冻任务 + * + * @param string $bucket bucket名称 + * @param string $object object名称 + * @return null + * @throws OssException + */ + public function restoreObject($bucket, $object, $options = NULL) + { + $this->precheckCommon($bucket, $object, $options); + $options[self::OSS_BUCKET] = $bucket; + $options[self::OSS_METHOD] = self::OSS_HTTP_POST; + $options[self::OSS_OBJECT] = $object; + $options[self::OSS_SUB_RESOURCE] = self::OSS_RESTORE; + $response = $this->auth($options); + $result = new PutSetDeleteResult($response); + return $result->getData(); + } + /** * 获取分片大小,根据用户提供的part_size,重新计算一个更合理的partsize * @@ -2349,6 +2372,7 @@ private function generateSignableQueryStringParam($options) self::OSS_PROCESS, self::OSS_POSITION, self::OSS_SYMLINK, + self::OSS_RESTORE, ); foreach ($signableList as $item) { @@ -2613,6 +2637,10 @@ public function setConnectTimeout($connectTimeout) const OSS_HTTP_CODE = 'http_code'; const OSS_REQUEST_ID = 'x-oss-request-id'; const OSS_INFO = 'info'; + const OSS_RESTORE = 'restore'; + const OSS_STORAGE_TYPE_STANDARD = 'Standard'; + const OSS_STORAGE_TYPE_IA = 'IA'; + const OSS_STORAGE_TYPE_ARCHIVE = 'Archive'; //私有URL变量 const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId'; diff --git a/tests/OSS/Tests/OssClientBucketTest.php b/tests/OSS/Tests/OssClientBucketTest.php index 57d4459f..bb1f053b 100644 --- a/tests/OSS/Tests/OssClientBucketTest.php +++ b/tests/OSS/Tests/OssClientBucketTest.php @@ -10,6 +10,9 @@ class OssClientBucketTest extends TestOssClientBase { + private $IABucket; + private $ArchiveBucket; + public function testBucketWithInvalidName() { try { @@ -54,4 +57,45 @@ public function testBucket() $this->assertEquals('200', $res['info']['http_code']); $this->assertEquals('oss-us-west-1', $res['x-oss-bucket-region']); } + + public function testCreateBucketWithStorageType() + { + $object = 'storage-object'; + + $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + try{ + $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('403', $e->getHTTPStatus()); + $this->assertEquals('InvalidObjectState', $e->getErrorCode()); + } + + $this->ossClient->putObject($this->IABucket, $object,'testcontent'); + $result = $this->ossClient->getObject($this->IABucket, $object); + $this->assertEquals($result, 'testcontent'); + + $this->ossClient->putObject($this->bucket, $object,'testcontent'); + $result = $this->ossClient->getObject($this->bucket, $object); + $this->assertEquals($result, 'testcontent'); + } + + public function setUp() + { + parent::setUp(); // TODO: Change the autogenerated stub + $this->IABucket = 'ia-'.$this->bucket; + $this->ArchiveBucket = 'archive-'.$this->bucket; + $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); + $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + } + + public function tearDown() + { + $object = 'storage-object'; + parent::tearDown(); // TODO: Change the autogenerated stub + $this->ossClient->deleteObject($this->IABucket, $object); + $this->ossClient->deleteObject($this->ArchiveBucket, $object); + $this->ossClient->deleteBucket($this->IABucket); + $this->ossClient->deleteBucket($this->ArchiveBucket); + } } diff --git a/tests/OSS/Tests/OssClientRestoreObjectTest.php b/tests/OSS/Tests/OssClientRestoreObjectTest.php new file mode 100644 index 00000000..ad830b20 --- /dev/null +++ b/tests/OSS/Tests/OssClientRestoreObjectTest.php @@ -0,0 +1,87 @@ +ossClient->putObject($this->IABucket, $object,'testcontent'); + try{ + $this->ossClient->restoreObject($this->IABucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('400', $e->getHTTPStatus()); + $this->assertEquals('OperationNotSupported', $e->getErrorCode()); + } + } + + public function testNullObjectRestoreObject() + { + $object = 'null-object'; + + try{ + $this->ossClient->restoreObject($this->bucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('404', $e->getHTTPStatus()); + } + } + + public function testArchiveRestoreObject() + { + $object = 'storage-object'; + + $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + try{ + $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('403', $e->getHTTPStatus()); + $this->assertEquals('InvalidObjectState', $e->getErrorCode()); + } + $result = $this->ossClient->restoreObject($this->ArchiveBucket, $object); + common::waitMetaSync(); + $this->assertEquals('202', $result['info']['http_code']); + + try{ + $this->ossClient->restoreObject($this->ArchiveBucket, $object); + }catch(OssException $e){ + $this->assertEquals('409', $e->getHTTPStatus()); + $this->assertEquals('RestoreAlreadyInProgress', $e->getErrorCode()); + } + } + + public function setUp() + { + parent::setUp(); // TODO: Change the autogenerated stub + $this->IABucket = 'ia-'.$this->bucket; + $this->ArchiveBucket = 'archive-'.$this->bucket; + $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); + $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + } + + public function tearDown() + { + parent::tearDown(); // TODO: Change the autogenerated stub + $object = 'storage-object'; + $this->ossClient->deleteObject($this->IABucket, $object); + $this->ossClient->deleteObject($this->ArchiveBucket, $object); + $this->ossClient->deleteBucket($this->IABucket); + $this->ossClient->deleteBucket($this->ArchiveBucket); + } +} + + + From 52b8202b9d013202189d61c0185b88b13f7aa90e Mon Sep 17 00:00:00 2001 From: ljbreak2008 Date: Thu, 4 Jan 2018 15:22:57 +0800 Subject: [PATCH 2/3] restore dev --- src/OSS/OssClient.php | 31 ++++++++++- tests/OSS/Tests/OssClientBucketTest.php | 46 ++++++++++------- .../OSS/Tests/OssClientRestoreObjectTest.php | 51 +++++++++++-------- 3 files changed, 88 insertions(+), 40 deletions(-) diff --git a/src/OSS/OssClient.php b/src/OSS/OssClient.php index 9d9605ac..66b694eb 100644 --- a/src/OSS/OssClient.php +++ b/src/OSS/OssClient.php @@ -134,14 +134,18 @@ public function listBuckets($options = NULL) * @param string $storageType * @return null */ - public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL, $storageType = self::OSS_STORAGE_TYPE_STANDARD) + public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL) { $this->precheckCommon($bucket, NULL, $options, false); $options[self::OSS_BUCKET] = $bucket; $options[self::OSS_METHOD] = self::OSS_HTTP_PUT; $options[self::OSS_OBJECT] = '/'; $options[self::OSS_HEADERS] = array(self::OSS_ACL => $acl); - $options[self::OSS_CONTENT] = OssUtil::createBucketXmlBody($storageType); + if (isset($options[self::OSS_RESTORE])) { + $this->precheckRestore($options[self::OSS_RESTORE]); + $options[self::OSS_CONTENT] = OssUtil::createBucketXmlBody($options[self::OSS_RESTORE]); + unset($options[self::OSS_RESTORE]); + } $response = $this->auth($options); $result = new PutSetDeleteResult($response); return $result->getData(); @@ -1904,6 +1908,29 @@ private function precheckObject($object) OssUtil::throwOssExceptionWithMessageIfEmpty($object, "object name is empty"); } + /** + * 校验option restore + * + * @param string $restore + * @throws OssException + */ + private function precheckRestore($restore) + { + if(is_string($restore)){ + switch($restore){ + case self::OSS_STORAGE_TYPE_ARCHIVE: + return ; + case self::OSS_STORAGE_TYPE_IA: + return ; + case self::OSS_STORAGE_TYPE_STANDARD: + return; + default: + break; + } + } + throw new OssException('restore name is invalid'); + } + /** * 校验bucket,options参数 * diff --git a/tests/OSS/Tests/OssClientBucketTest.php b/tests/OSS/Tests/OssClientBucketTest.php index bb1f053b..f8bfa00e 100644 --- a/tests/OSS/Tests/OssClientBucketTest.php +++ b/tests/OSS/Tests/OssClientBucketTest.php @@ -10,8 +10,8 @@ class OssClientBucketTest extends TestOssClientBase { - private $IABucket; - private $ArchiveBucket; + private $iaBucket; + private $archiveBucket; public function testBucketWithInvalidName() { @@ -62,17 +62,17 @@ public function testCreateBucketWithStorageType() { $object = 'storage-object'; - $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + $this->ossClient->putObject($this->archiveBucket, $object,'testcontent'); try{ - $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->ossClient->getObject($this->archiveBucket, $object); $this->assertTrue(false); }catch (OssException $e){ $this->assertEquals('403', $e->getHTTPStatus()); $this->assertEquals('InvalidObjectState', $e->getErrorCode()); } - $this->ossClient->putObject($this->IABucket, $object,'testcontent'); - $result = $this->ossClient->getObject($this->IABucket, $object); + $this->ossClient->putObject($this->iaBucket, $object,'testcontent'); + $result = $this->ossClient->getObject($this->iaBucket, $object); $this->assertEquals($result, 'testcontent'); $this->ossClient->putObject($this->bucket, $object,'testcontent'); @@ -80,22 +80,34 @@ public function testCreateBucketWithStorageType() $this->assertEquals($result, 'testcontent'); } - public function setUp() + public function setUp()e { - parent::setUp(); // TODO: Change the autogenerated stub - $this->IABucket = 'ia-'.$this->bucket; - $this->ArchiveBucket = 'archive-'.$this->bucket; - $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); - $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + parent::setUp(); + + $this->iaBucket = 'ia-' . $this->bucket; + $this->archiveBucket = 'archive-' . $this->bucket; + $options = array( + OssClient::OSS_RESTORE => OssClient::OSS_STORAGE_TYPE_IA + ); + + $this->ossClient->createBucket($this->iaBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options); + + $options = array( + OssClient::OSS_RESTORE => OssClient::OSS_STORAGE_TYPE_ARCHIVE + ); + + $this->ossClient->createBucket($this->archiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options); } public function tearDown() { + parent::tearDown(); + $object = 'storage-object'; - parent::tearDown(); // TODO: Change the autogenerated stub - $this->ossClient->deleteObject($this->IABucket, $object); - $this->ossClient->deleteObject($this->ArchiveBucket, $object); - $this->ossClient->deleteBucket($this->IABucket); - $this->ossClient->deleteBucket($this->ArchiveBucket); + + $this->ossClient->deleteObject($this->iaBucket, $object); + $this->ossClient->deleteObject($this->archiveBucket, $object); + $this->ossClient->deleteBucket($this->iaBucket); + $this->ossClient->deleteBucket($this->archiveBucket); } } diff --git a/tests/OSS/Tests/OssClientRestoreObjectTest.php b/tests/OSS/Tests/OssClientRestoreObjectTest.php index ad830b20..a5b8780b 100644 --- a/tests/OSS/Tests/OssClientRestoreObjectTest.php +++ b/tests/OSS/Tests/OssClientRestoreObjectTest.php @@ -10,16 +10,16 @@ class OssClientRestoreObjectTest extends TestOssClientBase { - private $IABucket; - private $ArchiveBucket; + private $iaBucket; + private $archiveBucket; public function testIARestoreObject() { $object = 'storage-object'; - $this->ossClient->putObject($this->IABucket, $object,'testcontent'); + $this->ossClient->putObject($this->iaBucket, $object,'testcontent'); try{ - $this->ossClient->restoreObject($this->IABucket, $object); + $this->ossClient->restoreObject($this->iaBucket, $object); $this->assertTrue(false); }catch (OssException $e){ $this->assertEquals('400', $e->getHTTPStatus()); @@ -43,20 +43,20 @@ public function testArchiveRestoreObject() { $object = 'storage-object'; - $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + $this->ossClient->putObject($this->archiveBucket, $object,'testcontent'); try{ - $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->ossClient->getObject($this->archiveBucket, $object); $this->assertTrue(false); }catch (OssException $e){ $this->assertEquals('403', $e->getHTTPStatus()); $this->assertEquals('InvalidObjectState', $e->getErrorCode()); } - $result = $this->ossClient->restoreObject($this->ArchiveBucket, $object); + $result = $this->ossClient->restoreObject($this->archiveBucket, $object); common::waitMetaSync(); $this->assertEquals('202', $result['info']['http_code']); try{ - $this->ossClient->restoreObject($this->ArchiveBucket, $object); + $this->ossClient->restoreObject($this->archiveBucket, $object); }catch(OssException $e){ $this->assertEquals('409', $e->getHTTPStatus()); $this->assertEquals('RestoreAlreadyInProgress', $e->getErrorCode()); @@ -65,23 +65,32 @@ public function testArchiveRestoreObject() public function setUp() { - parent::setUp(); // TODO: Change the autogenerated stub - $this->IABucket = 'ia-'.$this->bucket; - $this->ArchiveBucket = 'archive-'.$this->bucket; - $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); - $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + parent::setUp(); + + $this->iaBucket = 'ia-' . $this->bucket; + $this->archiveBucket = 'archive-' . $this->bucket; + $options = array( + OssClient::OSS_RESTORE => OssClient::OSS_STORAGE_TYPE_IA + ); + + $this->ossClient->createBucket($this->iaBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options); + + $options = array( + OssClient::OSS_RESTORE => OssClient::OSS_STORAGE_TYPE_ARCHIVE + ); + + $this->ossClient->createBucket($this->archiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options); } public function tearDown() { - parent::tearDown(); // TODO: Change the autogenerated stub + parent::tearDown(); + $object = 'storage-object'; - $this->ossClient->deleteObject($this->IABucket, $object); - $this->ossClient->deleteObject($this->ArchiveBucket, $object); - $this->ossClient->deleteBucket($this->IABucket); - $this->ossClient->deleteBucket($this->ArchiveBucket); + + $this->ossClient->deleteObject($this->iaBucket, $object); + $this->ossClient->deleteObject($this->archiveBucket, $object); + $this->ossClient->deleteBucket($this->iaBucket); + $this->ossClient->deleteBucket($this->archiveBucket); } } - - - From 8b1760ddc60ee433584483ba2ee2d50046617e11 Mon Sep 17 00:00:00 2001 From: ljbreak2008 Date: Thu, 4 Jan 2018 15:27:40 +0800 Subject: [PATCH 3/3] restore dev --- tests/OSS/Tests/OssClientBucketTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/OSS/Tests/OssClientBucketTest.php b/tests/OSS/Tests/OssClientBucketTest.php index f8bfa00e..b89e75bb 100644 --- a/tests/OSS/Tests/OssClientBucketTest.php +++ b/tests/OSS/Tests/OssClientBucketTest.php @@ -80,7 +80,7 @@ public function testCreateBucketWithStorageType() $this->assertEquals($result, 'testcontent'); } - public function setUp()e + public function setUp() { parent::setUp();