Skip to content

Commit

Permalink
Merge 8b1760d into 3e26144
Browse files Browse the repository at this point in the history
  • Loading branch information
ljbreak2008 committed Jan 4, 2018
2 parents 3e26144 + 8b1760d commit d56372a
Show file tree
Hide file tree
Showing 4 changed files with 220 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/OSS/Core/OssUtil.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 version="1.0" encoding="UTF-8"?><CreateBucketConfiguration></CreateBucketConfiguration>');
$xml->addChild('StorageClass', $storageClass);
return $xml->asXML();
}

/**
* 检验$options
*
Expand Down
55 changes: 55 additions & 0 deletions src/OSS/OssClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ 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)
Expand All @@ -140,6 +141,11 @@ public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $option
$options[self::OSS_METHOD] = self::OSS_HTTP_PUT;
$options[self::OSS_OBJECT] = '/';
$options[self::OSS_HEADERS] = array(self::OSS_ACL => $acl);
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();
Expand Down Expand Up @@ -1412,6 +1418,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
*
Expand Down Expand Up @@ -1881,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参数
*
Expand Down Expand Up @@ -2349,6 +2399,7 @@ private function generateSignableQueryStringParam($options)
self::OSS_PROCESS,
self::OSS_POSITION,
self::OSS_SYMLINK,
self::OSS_RESTORE,
);

foreach ($signableList as $item) {
Expand Down Expand Up @@ -2613,6 +2664,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';
Expand Down
56 changes: 56 additions & 0 deletions tests/OSS/Tests/OssClientBucketTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@

class OssClientBucketTest extends TestOssClientBase
{
private $iaBucket;
private $archiveBucket;

public function testBucketWithInvalidName()
{
try {
Expand Down Expand Up @@ -54,4 +57,57 @@ 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();

$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';

$this->ossClient->deleteObject($this->iaBucket, $object);
$this->ossClient->deleteObject($this->archiveBucket, $object);
$this->ossClient->deleteBucket($this->iaBucket);
$this->ossClient->deleteBucket($this->archiveBucket);
}
}
96 changes: 96 additions & 0 deletions tests/OSS/Tests/OssClientRestoreObjectTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

namespace OSS\Tests;

use OSS\Core\OssException;
use OSS\OssClient;

require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php';


class OssClientRestoreObjectTest extends TestOssClientBase
{
private $iaBucket;
private $archiveBucket;

public function testIARestoreObject()
{
$object = 'storage-object';

$this->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();

$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';

$this->ossClient->deleteObject($this->iaBucket, $object);
$this->ossClient->deleteObject($this->archiveBucket, $object);
$this->ossClient->deleteBucket($this->iaBucket);
$this->ossClient->deleteBucket($this->archiveBucket);
}
}

0 comments on commit d56372a

Please sign in to comment.