Skip to content

Commit

Permalink
Merge 74f7e2d into d259c08
Browse files Browse the repository at this point in the history
  • Loading branch information
gsreynolds committed Jul 9, 2020
2 parents d259c08 + 74f7e2d commit ce41a49
Show file tree
Hide file tree
Showing 5 changed files with 294 additions and 1 deletion.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/.bundle/
vendor
/.yardoc
/Gemfile.lock
/_yardoc/
Expand Down
32 changes: 32 additions & 0 deletions lib/aliyun/oss/bucket.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,38 @@ def logging=(logging)
end
end

# 获取Bucket的versioning配置
# @return [BucketVersioning] Bucket的versioning配置
def versioning
@protocol.get_bucket_versioning(name)
end

# 设置Bucket的versioning配置
# @param versioning [BucketVersioning] versioning配置
def versioning=(versioning)
if versioning.enabled?
@protocol.put_bucket_versioning(name, versioning)
else
@protocol.delete_bucket_versioning(name)
end
end

# 获取Bucket的encryption配置
# @return [BucketEncryption] Bucket的encryption配置
def encryption
@protocol.get_bucket_encryption(name)
end

# 设置Bucket的encryption配置
# @param encryption [BucketEncryption] encryption配置
def encryption=(encryption)
if encryption.enabled?
@protocol.put_bucket_encryption(name, encryption)
else
@protocol.delete_bucket_encryption(name)
end
end

# 获取Bucket的website配置
# @return [BucketWebsite] Bucket的website配置
def website
Expand Down
114 changes: 114 additions & 0 deletions lib/aliyun/oss/protocol.rb
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,120 @@ def delete_bucket_logging(name)
logger.info("Done delete bucket logging")
end

# Put bucket versioning settings
# @param name [String] the bucket name
# @param versioning [BucketVersioning] versioning options
def put_bucket_versioning(name, versioning)
logger.info("Begin put bucket versioning, "\
"name: #{name}, versioning: #{versioning}")

sub_res = {'versioning' => nil}
body = Nokogiri::XML::Builder.new do |xml|
xml.VersioningConfiguration {
xml.Status versioning.enabled? ? 'Enabled' : 'Suspended'
}
end.to_xml

@http.put(
{:bucket => name, :sub_res => sub_res},
{:body => body})

logger.info("Done put bucket versioning")
end

# Get bucket versioning settings
# @param name [String] the bucket name
# @return [BucketVersioning] versioning options of this bucket
def get_bucket_versioning(name)
logger.info("Begin get bucket versioning, name: #{name}")

sub_res = {'versioning' => nil}
r = @http.get({:bucket => name, :sub_res => sub_res})

doc = parse_xml(r.body)
opts = {:enable => false}

versioning_node = doc.at_css("VersioningConfiguration")
opts[:enable] = get_node_text(versioning_node, 'Status') == 'Enabled'

logger.info("Done get bucket versioning")

BucketVersioning.new(opts)
end

# Delete bucket versioning settings, a.k.a. disable bucket versioning
# @param name [String] the bucket name
def delete_bucket_versioning(name)
logger.info("Begin delete bucket versioning, name: #{name}")

sub_res = {'versioning' => nil}
@http.delete({:bucket => name, :sub_res => sub_res})

logger.info("Done delete bucket versioning")
end

# Put bucket encryption settings
# @param name [String] the bucket name
# @param encryption [BucketEncryption] encryption options
def put_bucket_encryption(name, encryption)
logger.info("Begin put bucket encryption, "\
"name: #{name}, encryption: #{encryption}")

if encryption.sse_algorithm == 'KMS' && !encryption.kms_master_key_id
fail ClientError,
"Must specify KMS Master Key ID when enabling KMS encryption."
end

sub_res = {'encryption' => nil}
body = Nokogiri::XML::Builder.new do |xml|
xml.ServerSideEncryptionRule {
xml.ApplyServerSideEncryptionByDefault {
xml.SSEAlgorithm encryption.sse_algorithm
xml.KMSMasterKeyID encryption.kms_master_key_id if encryption.kms_master_key_id
}
}
end.to_xml

@http.put(
{:bucket => name, :sub_res => sub_res},
{:body => body})

logger.info("Done put bucket encryption")
end

# Get bucket encryption settings
# @param name [String] the bucket name
# @return [BucketEncryption] encryption options of this bucket
def get_bucket_encryption(name)
logger.info("Begin get bucket encryption, name: #{name}")

sub_res = {'encryption' => nil}
r = @http.get({:bucket => name, :sub_res => sub_res})

doc = parse_xml(r.body)

encryption_node = doc.at_css("ApplyServerSideEncryptionByDefault")
opts = {
:sse_algorithm => get_node_text(encryption_node, 'SSEAlgorithm'),
:kms_master_key_id => get_node_text(encryption_node, 'KMSMasterKeyID')
}

logger.info("Done get bucket encryption")

BucketEncryption.new(opts)
end

# Delete bucket encryption settings, a.k.a. disable bucket encryption
# @param name [String] the bucket name
def delete_bucket_encryption(name)
logger.info("Begin delete bucket encryption, name: #{name}")

sub_res = {'encryption' => nil}
@http.delete({:bucket => name, :sub_res => sub_res})

logger.info("Done delete bucket encryption")
end

# Put bucket website settings
# @param name [String] the bucket name
# @param website [BucketWebsite] the bucket website options
Expand Down
29 changes: 29 additions & 0 deletions lib/aliyun/oss/struct.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,35 @@ def enabled?
end
end

##
# Bucket Versioning setting. See: {http://help.aliyun.com/document_detail/oss/product-documentation/function/versioning.html OSS Bucket versioning}
# Attributes:
# * enable [Boolean] whether to enable bucket versioning
# @example Enable bucket versioning
# bucket.versioning = BucketVersioning.new(:enable => true)
# @example Disable bucket versioning
# bucket.versioning = BucketVersioning.new(:enable => false)
class BucketVersioning < Common::Struct::Base
attrs :enable

def enabled?
enable == true
end
end

##
# Bucket Encryption setting. See: {http://help.aliyun.com/document_detail/oss/product-documentation/function/encryption.html OSS Bucket encryption}
# Attributes:
# * sse_algorithm [string] Indicates the default server-side encryption method
# * kms_master_key_id [string] Indicates the ID of CMK that is currently used.
class BucketEncryption < Common::Struct::Base
attrs :enable, :sse_algorithm, :kms_master_key_id

def enabled?
enable == true
end
end

##
# Bucket website setting. See: {http://help.aliyun.com/document_detail/oss/product-documentation/function/host-static-website.html OSS Website hosting}
# Attributes:
Expand Down
119 changes: 118 additions & 1 deletion spec/aliyun/oss/bucket_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,25 @@ def mock_logging(opts)
end.to_xml
end

def mock_versioning(opts)
Nokogiri::XML::Builder.new do |xml|
xml.VersioningConfiguration {
xml.Status opts.enabled? ? 'Enabled' : 'Suspended'
}
end.to_xml
end

def mock_encryption(opts)
Nokogiri::XML::Builder.new do |xml|
xml.ServerSideEncryptionRule {
xml.ApplyServerSideEncryptionByDefault {
xml.SSEAlgorithm 'KMS'
xml.KMSMasterKeyID '9468da86-3509-4f8d-a61e-6eab1eac****'
}
}
end.to_xml
end

def mock_website(opts)
Nokogiri::XML::Builder.new do |xml|
xml.WebsiteConfiguration {
Expand Down Expand Up @@ -354,7 +373,7 @@ def err(msg, reqid = '0000')
end
end # delete bucket

context "acl, logging, website, referer, lifecycle" do
context "acl, logging, versioning, encryption, website, referer, lifecycle" do
it "should update acl" do
query = {'acl' => nil}
stub_request(:put, request_path).with(:query => query)
Expand Down Expand Up @@ -472,6 +491,104 @@ def err(msg, reqid = '0000')
}.to raise_error(ClientError)
end

it "should enable versioning" do
query = {'versioning' => nil}
stub_request(:put, request_path).with(:query => query)

versioning_opts = BucketVersioning.new(:enable => true)
@protocol.put_bucket_versioning(@bucket, versioning_opts)

expect(WebMock).to have_requested(:put, request_path)
.with(:query => query, :body => mock_versioning(versioning_opts))
end

it "should disable versioning" do
query = {'versioning' => nil}
stub_request(:put, request_path).with(:query => query)

versioning_opts = BucketVersioning.new(:enable => false)
@protocol.put_bucket_versioning(@bucket, versioning_opts)

expect(WebMock).to have_requested(:put, request_path)
.with(:query => query, :body => mock_versioning(versioning_opts))
end

it "should get versioning" do
query = {'versioning' => nil}
versioning_opts = BucketVersioning.new(:enable => true)

stub_request(:get, request_path)
.with(:query => query)
.to_return(:body => mock_versioning(versioning_opts))

versioning = @protocol.get_bucket_versioning(@bucket)

expect(WebMock).to have_requested(:get, request_path)
.with(:query => query, :body => nil)
expect(versioning.to_s).to eq(versioning_opts.to_s)
end

it "should delete versioning" do
query = {'versioning' => nil}
stub_request(:delete, request_path).with(:query => query)

@protocol.delete_bucket_versioning(@bucket)

expect(WebMock).to have_requested(:delete, request_path)
.with(:query => query, :body => nil)
end

it "should enable encryption" do
query = {'encryption' => nil}
stub_request(:put, request_path).with(:query => query)

encryption_opts = BucketEncryption.new(
:sse_algorithm => 'KMS',
:kms_master_key_id => '9468da86-3509-4f8d-a61e-6eab1eac****')
@protocol.put_bucket_encryption(@bucket, encryption_opts)

expect(WebMock).to have_requested(:put, request_path)
.with(:query => query, :body => mock_encryption(encryption_opts))
end

it "should get encryption" do
query = {'encryption' => nil}
encryption_opts = BucketEncryption.new(
:sse_algorithm => 'KMS',
:kms_master_key_id => '9468da86-3509-4f8d-a61e-6eab1eac****')

stub_request(:get, request_path)
.with(:query => query)
.to_return(:body => mock_encryption(encryption_opts))

encryption = @protocol.get_bucket_encryption(@bucket)

expect(WebMock).to have_requested(:get, request_path)
.with(:query => query, :body => nil)
expect(encryption.to_s).to eq(encryption_opts.to_s)
end

it "should delete encryption" do
query = {'encryption' => nil}
stub_request(:delete, request_path).with(:query => query)

@protocol.delete_bucket_encryption(@bucket)

expect(WebMock).to have_requested(:delete, request_path)
.with(:query => query, :body => nil)
end

it "should raise Exception when enable encryption" do
query = {'encryption' => nil}
stub_request(:put, request_path).with(:query => query)

encryption_opts = BucketEncryption.new(
:sse_algorithm => 'KMS')
expect {
@protocol.put_bucket_encryption(@bucket, encryption_opts)
}.to raise_error(ClientError)
end

it "should update website" do
query = {'website' => nil}
stub_request(:put, request_path).with(:query => query)
Expand Down

0 comments on commit ce41a49

Please sign in to comment.