Merge branch 'master' into stable
This commit is contained in:
commit
7110f8c315
@ -1,7 +1,7 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
cache: bundler
|
cache: bundler
|
||||||
rvm:
|
rvm:
|
||||||
- 2.2.4
|
- 2.2.5
|
||||||
services:
|
services:
|
||||||
- redis-server
|
- redis-server
|
||||||
before_install:
|
before_install:
|
||||||
|
2
Gemfile
2
Gemfile
@ -9,7 +9,7 @@ gem "rest-client"
|
|||||||
gem "redis"
|
gem "redis"
|
||||||
# Remove require when we can update to 3.0, which sets the new storage
|
# Remove require when we can update to 3.0, which sets the new storage
|
||||||
# format to columnar by default. Increases performance
|
# format to columnar by default. Increases performance
|
||||||
gem "mime-types", "~> 2.99", require: 'mime/types/columnar'
|
gem "mime-types"
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'rake'
|
gem 'rake'
|
||||||
|
62
Gemfile.lock
62
Gemfile.lock
@ -13,28 +13,28 @@ GIT
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
activesupport (4.2.5.1)
|
activesupport (5.0.0)
|
||||||
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (~> 0.7)
|
i18n (~> 0.7)
|
||||||
json (~> 1.7, >= 1.7.7)
|
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
thread_safe (~> 0.3, >= 0.3.4)
|
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
backports (3.6.8)
|
backports (3.6.8)
|
||||||
beefcake (0.3.7)
|
beefcake (0.3.7)
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
domain_name (0.5.20160216)
|
concurrent-ruby (1.0.2)
|
||||||
|
domain_name (0.5.20160615)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
excon (0.45.4)
|
excon (0.51.0)
|
||||||
faraday (0.9.2)
|
faraday (0.9.2)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
fog-aws (0.8.1)
|
fog-aws (0.10.0)
|
||||||
fog-core (~> 1.27)
|
fog-core (~> 1.38)
|
||||||
fog-json (~> 1.0)
|
fog-json (~> 1.0)
|
||||||
fog-xml (~> 0.1)
|
fog-xml (~> 0.1)
|
||||||
ipaddress (~> 0.8)
|
ipaddress (~> 0.8)
|
||||||
fog-core (1.36.0)
|
fog-core (1.42.0)
|
||||||
builder
|
builder
|
||||||
excon (~> 0.45)
|
excon (~> 0.49)
|
||||||
formatador (~> 0.2)
|
formatador (~> 0.2)
|
||||||
fog-json (1.0.2)
|
fog-json (1.0.2)
|
||||||
fog-core (~> 1.0)
|
fog-core (~> 1.0)
|
||||||
@ -48,21 +48,24 @@ GEM
|
|||||||
i18n (0.7.0)
|
i18n (0.7.0)
|
||||||
innertube (1.0.2)
|
innertube (1.0.2)
|
||||||
ipaddress (0.8.3)
|
ipaddress (0.8.3)
|
||||||
json (1.8.3)
|
|
||||||
kgio (2.10.0)
|
kgio (2.10.0)
|
||||||
m (1.4.2)
|
m (1.5.0)
|
||||||
method_source (>= 0.6.7)
|
method_source (>= 0.6.7)
|
||||||
rake (>= 0.9.2.2)
|
rake (>= 0.9.2.2)
|
||||||
method_source (0.8.2)
|
method_source (0.8.2)
|
||||||
mime-types (2.99.1)
|
mime-types (3.1)
|
||||||
mini_portile2 (2.0.0)
|
mime-types-data (~> 3.2015)
|
||||||
minitest (5.8.4)
|
mime-types-data (3.2016.0521)
|
||||||
|
mini_portile2 (2.1.0)
|
||||||
|
minitest (5.9.0)
|
||||||
minitest-stub_any_instance (1.0.1)
|
minitest-stub_any_instance (1.0.1)
|
||||||
multi_json (1.11.2)
|
multi_json (1.12.1)
|
||||||
multipart-post (2.0.0)
|
multipart-post (2.0.0)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
nokogiri (1.6.7.2)
|
nokogiri (1.6.8)
|
||||||
mini_portile2 (~> 2.0.0.rc2)
|
mini_portile2 (~> 2.1.0)
|
||||||
|
pkg-config (~> 1.1.7)
|
||||||
|
pkg-config (1.1.7)
|
||||||
purdytest (2.0.0)
|
purdytest (2.0.0)
|
||||||
minitest (~> 5.5)
|
minitest (~> 5.5)
|
||||||
rack (1.6.4)
|
rack (1.6.4)
|
||||||
@ -74,20 +77,20 @@ GEM
|
|||||||
kgio (~> 2.5)
|
kgio (~> 2.5)
|
||||||
rack (~> 1.1)
|
rack (~> 1.1)
|
||||||
unicorn (~> 5.0)
|
unicorn (~> 5.0)
|
||||||
raindrops (0.15.0)
|
raindrops (0.16.0)
|
||||||
rake (10.5.0)
|
rake (11.2.2)
|
||||||
redis (3.2.2)
|
redis (3.3.1)
|
||||||
rest-client (1.8.0)
|
rest-client (2.0.0)
|
||||||
http-cookie (>= 1.0.2, < 2.0)
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
mime-types (>= 1.16, < 3.0)
|
mime-types (>= 1.16, < 4.0)
|
||||||
netrc (~> 0.7)
|
netrc (~> 0.8)
|
||||||
sentry-raven (0.15.6)
|
sentry-raven (1.2.0)
|
||||||
faraday (>= 0.7.6)
|
faraday (>= 0.7.6, < 0.10.x)
|
||||||
sinatra (1.4.7)
|
sinatra (1.4.7)
|
||||||
rack (~> 1.5)
|
rack (~> 1.5)
|
||||||
rack-protection (~> 1.4)
|
rack-protection (~> 1.4)
|
||||||
tilt (>= 1.3, < 3)
|
tilt (>= 1.3, < 3)
|
||||||
sinatra-contrib (1.4.6)
|
sinatra-contrib (1.4.7)
|
||||||
backports (>= 2.0)
|
backports (>= 2.0)
|
||||||
multi_json
|
multi_json
|
||||||
rack-protection
|
rack-protection
|
||||||
@ -95,15 +98,14 @@ GEM
|
|||||||
sinatra (~> 1.4.0)
|
sinatra (~> 1.4.0)
|
||||||
tilt (>= 1.3, < 3)
|
tilt (>= 1.3, < 3)
|
||||||
thread_safe (0.3.5)
|
thread_safe (0.3.5)
|
||||||
tilt (2.0.2)
|
tilt (2.0.5)
|
||||||
tzinfo (1.2.2)
|
tzinfo (1.2.2)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.2)
|
unf_ext (0.0.7.2)
|
||||||
unicorn (5.0.1)
|
unicorn (5.1.0)
|
||||||
kgio (~> 2.6)
|
kgio (~> 2.6)
|
||||||
rack
|
|
||||||
raindrops (~> 0.7)
|
raindrops (~> 0.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
@ -113,7 +115,7 @@ DEPENDENCIES
|
|||||||
activesupport
|
activesupport
|
||||||
fog-aws
|
fog-aws
|
||||||
m
|
m
|
||||||
mime-types (~> 2.99)
|
mime-types
|
||||||
minitest-stub_any_instance
|
minitest-stub_any_instance
|
||||||
purdytest
|
purdytest
|
||||||
rainbows
|
rainbows
|
||||||
|
@ -24,7 +24,7 @@ module RemoteStorage
|
|||||||
return true if ["GET", "HEAD"].include?(request_method) && !listing
|
return true if ["GET", "HEAD"].include?(request_method) && !listing
|
||||||
end
|
end
|
||||||
|
|
||||||
server.halt 401, "Unauthorized" if token.empty?
|
server.halt 401, "Unauthorized" if token.nil? || token.empty?
|
||||||
|
|
||||||
authorizations = redis.smembers("authorizations:#{user}:#{token}")
|
authorizations = redis.smembers("authorizations:#{user}:#{token}")
|
||||||
permission = directory_permission(authorizations, directory)
|
permission = directory_permission(authorizations, directory)
|
||||||
@ -159,6 +159,7 @@ module RemoteStorage
|
|||||||
if update_metadata_object(user, directory, key, metadata)
|
if update_metadata_object(user, directory, key, metadata)
|
||||||
if metadata_changed?(existing_metadata, metadata)
|
if metadata_changed?(existing_metadata, metadata)
|
||||||
update_dir_objects(user, directory, timestamp, checksum_for(data))
|
update_dir_objects(user, directory, timestamp, checksum_for(data))
|
||||||
|
log_size_difference(user, existing_metadata["s"], metadata[:s])
|
||||||
end
|
end
|
||||||
|
|
||||||
server.headers["ETag"] = %Q("#{res.headers[:etag]}")
|
server.headers["ETag"] = %Q("#{res.headers[:etag]}")
|
||||||
@ -168,6 +169,11 @@ module RemoteStorage
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def log_size_difference(user, old_size, new_size)
|
||||||
|
delta = new_size.to_i - old_size.to_i
|
||||||
|
redis.incrby "rs:s:#{user}", delta
|
||||||
|
end
|
||||||
|
|
||||||
def checksum_for(data)
|
def checksum_for(data)
|
||||||
Digest::MD5.hexdigest(data)
|
Digest::MD5.hexdigest(data)
|
||||||
end
|
end
|
||||||
@ -182,6 +188,7 @@ module RemoteStorage
|
|||||||
end
|
end
|
||||||
|
|
||||||
do_delete_request(url)
|
do_delete_request(url)
|
||||||
|
log_size_difference(user, existing_metadata["s"], 0)
|
||||||
delete_metadata_objects(user, directory, key)
|
delete_metadata_objects(user, directory, key)
|
||||||
delete_dir_objects(user, directory)
|
delete_dir_objects(user, directory)
|
||||||
|
|
||||||
|
@ -74,6 +74,36 @@ describe "App" do
|
|||||||
root_items.must_equal ["food/"]
|
root_items.must_equal ["food/"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "logging usage size" do
|
||||||
|
before do
|
||||||
|
@put_stub = OpenStruct.new(headers: {
|
||||||
|
etag: "bla",
|
||||||
|
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
|
||||||
|
})
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
it "logs the complete size when creating new objects" do
|
||||||
|
RestClient.stub :put, @put_stub do
|
||||||
|
put "/phil/food/aguacate", "1234567890"
|
||||||
|
end
|
||||||
|
|
||||||
|
size_log = redis.get "rs:s:phil"
|
||||||
|
size_log.must_equal "10"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "logs the size difference when updating existing objects" do
|
||||||
|
RestClient.stub :put, @put_stub do
|
||||||
|
put "/phil/food/camaron", "1234567890"
|
||||||
|
put "/phil/food/aguacate", "1234567890"
|
||||||
|
put "/phil/food/aguacate", "123"
|
||||||
|
end
|
||||||
|
|
||||||
|
size_log = redis.get "rs:s:phil"
|
||||||
|
size_log.must_equal "13"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "objects in root dir" do
|
describe "objects in root dir" do
|
||||||
before do
|
before do
|
||||||
put_stub = OpenStruct.new(headers: {
|
put_stub = OpenStruct.new(headers: {
|
||||||
@ -250,7 +280,6 @@ describe "App" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "not authorized" do
|
context "not authorized" do
|
||||||
|
|
||||||
describe "with no token" do
|
describe "with no token" do
|
||||||
it "says it's not authorized" do
|
it "says it's not authorized" do
|
||||||
delete "/phil/food/aguacate"
|
delete "/phil/food/aguacate"
|
||||||
@ -260,6 +289,16 @@ describe "App" do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "with empty token" do
|
||||||
|
it "says it's not authorized" do
|
||||||
|
header "Authorization", "Bearer "
|
||||||
|
delete "/phil/food/aguacate"
|
||||||
|
|
||||||
|
last_response.status.must_equal 401
|
||||||
|
last_response.body.must_equal "Unauthorized"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "with wrong token" do
|
describe "with wrong token" do
|
||||||
it "says it's not authorized" do
|
it "says it's not authorized" do
|
||||||
header "Authorization", "Bearer wrongtoken"
|
header "Authorization", "Bearer wrongtoken"
|
||||||
@ -289,6 +328,17 @@ describe "App" do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "decreases the size log by size of deleted object" do
|
||||||
|
RestClient.stub :delete, "" do
|
||||||
|
RemoteStorage::Swift.stub_any_instance :etag_for, "rootetag" do
|
||||||
|
delete "/phil/food/aguacate"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
size_log = redis.get "rs:s:phil"
|
||||||
|
size_log.must_equal "8"
|
||||||
|
end
|
||||||
|
|
||||||
it "deletes the metadata object in redis" do
|
it "deletes the metadata object in redis" do
|
||||||
RestClient.stub :delete, "" do
|
RestClient.stub :delete, "" do
|
||||||
RemoteStorage::Swift.stub_any_instance :etag_for, "rootetag" do
|
RemoteStorage::Swift.stub_any_instance :etag_for, "rootetag" do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user