Skip to content

Commit

Permalink
Merge 43de636 into 3e26144
Browse files Browse the repository at this point in the history
  • Loading branch information
ljbreak2008 committed Jan 4, 2018
2 parents 3e26144 + 43de636 commit 8c38d61
Show file tree
Hide file tree
Showing 6 changed files with 245 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_STORAGE])) {
$this->precheckStorage($options[self::OSS_STORAGE]);
$options[self::OSS_CONTENT] = OssUtil::createBucketXmlBody($options[self::OSS_STORAGE]);
unset($options[self::OSS_STORAGE]);
}
$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_STORAGE;
$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 precheckStorage($storage)
{
if(is_string($storage)){
switch($storage){
case self::OSS_STORAGE_ARCHIVE:
return;
case self::OSS_STORAGE_IA:
return;
case self::OSS_STORAGE_STANDARD:
return;
default:
break;
}
}
throw new OssException('storage 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_STORAGE,
);

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_STORAGE = 'restore';
const OSS_STORAGE_STANDARD = 'Standard';
const OSS_STORAGE_IA = 'IA';
const OSS_STORAGE_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_STORAGE => OssClient::OSS_STORAGE_IA
);

$this->ossClient->createBucket($this->iaBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options);

$options = array(
OssClient::OSS_STORAGE => OssClient::OSS_STORAGE_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_STORAGE => OssClient::OSS_STORAGE_IA
);

$this->ossClient->createBucket($this->iaBucket, OssClient::OSS_ACL_TYPE_PRIVATE, $options);

$options = array(
OssClient::OSS_STORAGE => OssClient::OSS_STORAGE_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);
}
}
14 changes: 14 additions & 0 deletions tests/OSS/Tests/OssClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,20 @@ public function testGetBucketCors()
}
}

public function testGetBucketCname()
{
try {
$accessKeyId = ' ' . getenv('OSS_ACCESS_KEY_ID') . ' ';
$accessKeySecret = ' ' . getenv('OSS_ACCESS_KEY_SECRET') . ' ';
$endpoint = ' ' . getenv('OSS_ENDPOINT') . '/ ';
$bucket = getenv('OSS_BUCKET');
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
$ossClient->getBucketCname($bucket);
} catch (OssException $e) {
$this->assertFalse(true);
}
}

public function testProxySupport()
{
$accessKeyId = ' ' . getenv('OSS_ACCESS_KEY_ID') . ' ';
Expand Down
11 changes: 11 additions & 0 deletions tests/OSS/Tests/OssUtilTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

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

class OssUtilTest extends \PHPUnit_Framework_TestCase
{
Expand Down Expand Up @@ -106,6 +107,15 @@ public function testCreateCompleteMultipartUploadXmlBody()
$this->assertEquals($this->cleanXml(OssUtil::createCompleteMultipartUploadXmlBody($a)), $xml);
}

public function testCreateBucketXmlBody()
{
$xml = <<<BBBB
<?xml version="1.0" encoding="UTF-8"?><CreateBucketConfiguration><StorageClass>Standard</StorageClass></CreateBucketConfiguration>
BBBB;
$storageClass ="Standard";
$this->assertEquals($this->cleanXml(OssUtil::createBucketXmlBody($storageClass)), $xml);
}

public function testValidateBucket()
{
$this->assertTrue(OssUtil::validateBucket("xxx"));
Expand Down Expand Up @@ -211,4 +221,5 @@ private function cleanXml($xml)
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}

}

0 comments on commit 8c38d61

Please sign in to comment.