1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

first pass at models for Rackspace::Files

This commit is contained in:
geemus (Wesley Beary) 2010-02-27 13:39:33 -08:00
parent 00dd1a9671
commit 6905b0d28c
12 changed files with 371 additions and 7 deletions

View file

@ -35,13 +35,13 @@ unless Fog.mocking?
headers['If-Unmodified-Since'] = options['If-Unmodified-Since'].utc.strftime("%a, %d %b %Y %H:%M:%S +0000") if options['If-Modified-Since']
headers.merge!(options)
request({
:block => block,
:expects => 200,
:headers => headers,
:host => "#{bucket_name}.#{@host}",
:idempotent => true,
:method => 'GET',
:path => CGI.escape(object_name),
:block => block
:path => CGI.escape(object_name)
})
end

View file

@ -21,6 +21,10 @@ module Rackspace
@@connections[service]
end
def directories
self[:files].directories
end
def flavors
self[:servers].flavors
end

View file

@ -4,12 +4,18 @@ module Fog
def self.dependencies
[
"fog/rackspace/models/files/directory.rb",
"fog/rackspace/models/files/directories.rb",
"fog/rackspace/models/files/file.rb",
"fog/rackspace/models/files/files.rb",
"fog/rackspace/requests/files/delete_container.rb",
"fog/rackspace/requests/files/delete_object.rb",
"fog/rackspace/requests/files/get_container.rb",
"fog/rackspace/requests/files/get_containers.rb",
"fog/rackspace/requests/files/get_object.rb",
"fog/rackspace/requests/files/head_container.rb",
"fog/rackspace/requests/files/head_containers.rb",
"fog/rackspace/requests/files/head_object.rb",
"fog/rackspace/requests/files/put_container.rb",
"fog/rackspace/requests/files/put_object.rb"
]
@ -44,12 +50,12 @@ module Fog
metadata[:body] = data
metadata[:headers]['Content-Length'] = metadata[:body].size.to_s
else
filename = File.basename(data.path)
filename = ::File.basename(data.path)
unless (mime_types = MIME::Types.of(filename)).empty?
metadata[:headers]['Content-Type'] = mime_types.first.content_type
end
metadata[:body] = data.read
metadata[:headers]['Content-Length'] = File.size(data.path).to_s
metadata[:headers]['Content-Length'] = ::File.size(data.path).to_s
end
# metadata[:headers]['Content-MD5'] = Base64.encode64(Digest::MD5.digest(metadata[:body])).strip
metadata
@ -75,7 +81,7 @@ module Fog
response
end
def storage_request(params)
def storage_request(params, parse_json = true)
@storage_connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}")
response = @storage_connection.request({
:body => params[:body],
@ -89,7 +95,7 @@ module Fog
:path => "#{@storage_path}/#{params[:path]}",
:query => params[:query]
})
unless response.body.empty?
if !response.body.empty? && parse_json
response.body = JSON.parse(response.body)
end
response

View file

@ -0,0 +1,42 @@
module Fog
module Rackspace
class Files
def directories
Fog::Rackspace::Files::Directories.new(:connection => self)
end
class Directories < Fog::Collection
model Fog::Rackspace::Files::Directory
def all
if @loaded
clear
end
@loaded = true
data = connection.get_containers.body
data.each do |directory|
self << new(directory)
end
self
end
def get(name, options = {})
data = connection.get_container(name, options).body
directory = new(:name => name)
directory.files.merge_attributes(options)
directory.files.instance_variable_set(:@loaded, true)
data.each do |file|
directory.files << directory.files.new(file)
end
directory
rescue Excon::Errors::NotFound
nil
end
end
end
end
end

View file

@ -0,0 +1,39 @@
module Fog
module Rackspace
class Files
class Directory < Fog::Model
identity :name
attribute :bytes
attribute :count
def destroy
requires :name
connection.delete_container(@name)
true
rescue Excon::Errors::NotFound
false
end
def files
@files ||= begin
Fog::Rackspace::Files::Files.new(
:directory => self,
:connection => connection
)
end
end
def save
requires :name
connection.put_container(@name)
true
end
end
end
end
end

View file

@ -0,0 +1,59 @@
module Fog
module Rackspace
class Files
class File < Fog::Model
identity :key, 'Key'
attribute :body
attribute :content_length, 'Content-Length'
attribute :content_type, 'Content-Type'
attribute :etag, 'Etag'
attribute :last_modified, 'Last-Modified'
def body
@body ||= if last_modified
collection.get(identity).body
else
''
end
end
def directory
@directory
end
def destroy
requires :directory, :key
connection.delete_object(directory.name, @key)
true
end
def owner=(new_owner)
if new_owner
@owner = {
:display_name => new_owner['DisplayName'],
:id => new_owner['ID']
}
end
end
def save(options = {})
requires :body, :directory, :key
data = connection.put_object(directory.name, @key, @body, options)
@etag = data.headers['ETag']
true
end
private
def directory=(new_directory)
@directory = new_directory
end
end
end
end
end

View file

@ -0,0 +1,88 @@
module Fog
module Rackspace
class Files
class Files < Fog::Collection
attribute :limit
attribute :marker
attribute :path
attribute :prefix
model Fog::Rackspace::Files::File
def all(options = {})
merge_attributes(options)
if @loaded
clear
end
@loaded = true
collection = directory.collection.get(
directory.name,
options
)
if collection
self.replace(collection.files)
else
nil
end
end
def directory
@directory
end
def get(key, options = {}, &block)
options = {
'limit' => @limit,
'marker' => @marker,
'path' => @path,
'prefix' => @prefix
}.merge!(options)
data = connection.get_object(directory.name, key, options, &block)
file_data = {
:body => data.body,
:key => key
}
for key, value in data.headers
if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
file_data[key] = value
end
end
new(file_data)
rescue Excon::Errors::NotFound
nil
end
def get_url(key, expires)
connection.get_object_url(directory.name, key, expires)
end
def head(key, options = {})
data = connection.head_object(directory.name, key, options)
file_data = { :key => key }
for key, value in data.headers
if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
file_data[key] = value
end
end
new(file_data)
rescue Excon::Errors::NotFound
nil
end
def new(attributes = {})
super({ :directory => directory }.merge!(attributes))
end
private
def directory=(new_directory)
@directory = new_directory
end
end
end
end
end

View file

@ -4,7 +4,7 @@ unless Fog.mocking?
module Rackspace
class Files
# List number of containers and total bytes stored
# Get details for container and total bytes stored
#
# ==== Parameters
# * container<~String> - Name of container to retrieve info for
@ -20,6 +20,9 @@ unless Fog.mocking?
# * 'X-Account-Container-Count'<~String> - Count of containers
# * 'X-Account-Bytes-Used'<~String> - Bytes used
# * body<~Array>:
# * 'bytes'<~Integer> - Number of bytes used by container
# * 'count'<~Integer> - Number of items in container
# * 'name'<~String> - Name of container
# * item<~Hash>:
# * 'bytes'<~String> - Size of object
# * 'content_type'<~String> Content-Type of object

View file

@ -0,0 +1,41 @@
unless Fog.mocking?
module Fog
module Rackspace
class Files
# Get details for object
#
# ==== Parameters
# * container<~String> - Name of container to look in
# * object<~String> - Name of object to look for
#
def get_object(container, object, &block)
response = storage_request({
:block => block,
:expects => 200,
:method => 'GET',
:path => "#{CGI.escape(container)}/#{CGI.escape(object)}"
}, false)
response
end
end
end
end
else
module Fog
module Rackspace
class Servers
def get_object(container, object)
raise MockNotImplemented.new("Contributions welcome!")
end
end
end
end
end

View file

@ -0,0 +1,40 @@
unless Fog.mocking?
module Fog
module Rackspace
class Files
# Get headers for object
#
# ==== Parameters
# * container<~String> - Name of container to look in
# * object<~String> - Name of object to look for
#
def head_object(container, object)
response = storage_request({
:expects => 200,
:method => 'GET',
:path => "#{CGI.escape(container)}/#{CGI.escape(object)}"
}, false)
response
end
end
end
end
else
module Fog
module Rackspace
class Servers
def head_object(container, object)
raise MockNotImplemented.new("Contributions welcome!")
end
end
end
end
end

View file

@ -0,0 +1,21 @@
require File.dirname(__FILE__) + '/../../../spec_helper'
describe 'Rackspace::Files.get_object' do
describe 'success' do
before(:each) do
Rackspace[:files].put_container('container_name')
Rackspace[:files].put_object('container_name', 'object_name', lorem_file)
end
after(:each) do
Rackspace[:files].delete_object('container_name', 'object_name')
Rackspace[:files].delete_container('container_name')
end
it "should return proper attributes" do
Rackspace[:files].get_object('container_name', 'object_name')
end
end
end

View file

@ -0,0 +1,21 @@
require File.dirname(__FILE__) + '/../../../spec_helper'
describe 'Rackspace::Files.head_object' do
describe 'success' do
before(:each) do
Rackspace[:files].put_container('container_name')
Rackspace[:files].put_object('container_name', 'object_name', lorem_file)
end
after(:each) do
Rackspace[:files].delete_object('container_name', 'object_name')
Rackspace[:files].delete_container('container_name')
end
it "should return proper attributes" do
Rackspace[:files].head_object('container_name', 'object_name')
end
end
end