Class: Fog::Storage::Rackspace::Mock::MockObject

Inherits:
Object
  • Object
show all
Defined in:
lib/fog/rackspace/storage.rb

Overview

An in-memory Swift object.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data, service) ⇒ MockObject

Construct a new object. Generally, you should call Fog::Storage::Rackspace::Mock::MockContainer#add_object instead of instantiating these directly.



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/fog/rackspace/storage.rb', line 214

def initialize(data, service)
  data = Fog::Storage.parse_data(data)
  @service = service

  @bytes_used = data[:headers]['Content-Length']
  @content_type = data[:headers]['Content-Type']
  if data[:body].respond_to? :read
    @body = data[:body].read
  else
    @body = data[:body]
  end
  @last_modified = Time.now.utc
  @hash = Digest::MD5.hexdigest(@body)
  @meta = {}
  @static_manifest = false
end

Instance Attribute Details

#bodyObject (readonly)

Returns the value of attribute body



209
210
211
# File 'lib/fog/rackspace/storage.rb', line 209

def body
  @body
end

#bytes_usedObject (readonly)

Returns the value of attribute bytes_used



208
209
210
# File 'lib/fog/rackspace/storage.rb', line 208

def bytes_used
  @bytes_used
end

#content_typeObject (readonly)

Returns the value of attribute content_type



208
209
210
# File 'lib/fog/rackspace/storage.rb', line 208

def content_type
  @content_type
end

#hashObject (readonly)

Returns the value of attribute hash



208
209
210
# File 'lib/fog/rackspace/storage.rb', line 208

def hash
  @hash
end

#last_modifiedObject (readonly)

Returns the value of attribute last_modified



208
209
210
# File 'lib/fog/rackspace/storage.rb', line 208

def last_modified
  @last_modified
end

#metaObject (readonly)

Returns the value of attribute meta



209
210
211
# File 'lib/fog/rackspace/storage.rb', line 209

def meta
  @meta
end

#serviceObject (readonly)

Returns the value of attribute service



209
210
211
# File 'lib/fog/rackspace/storage.rb', line 209

def service
  @service
end

#static_manifestObject

Returns the value of attribute static_manifest



210
211
212
# File 'lib/fog/rackspace/storage.rb', line 210

def static_manifest
  @static_manifest
end

Instance Method Details

#dynamic_manifest?Boolean

Determine if this object has the metadata header that marks it as a dynamic large object manifest.



243
244
245
# File 'lib/fog/rackspace/storage.rb', line 243

def dynamic_manifest?
  ! large_object_prefix.nil?
end

#each_part {|MockObject| ... } ⇒ Object

Iterate through each MockObject that contains a part of the data for this logical object. In the normal case, this will only yield the receiver directly. For dynamic and static large object manifests, however, this call will yield each MockObject that contains a part of the whole, in sequence.

Manifests that refer to containers or objects that don't exist will skip those sections and log a warning, instead.

Yields:

  • (MockObject)

    Each object that holds a part of this logical object.



258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/fog/rackspace/storage.rb', line 258

def each_part
  case
  when dynamic_manifest?
    # Concatenate the contents and sizes of each matching object.
    # Note that cname and oprefix are already escaped.
    cname, oprefix = large_object_prefix.split('/', 2)

    target_container = service.data[cname]
    if target_container
      all = target_container.objects.keys
      matching = all.select { |name| name.start_with? oprefix }
      keys = matching.sort

      keys.each do |name|
        yield target_container.objects[name]
      end
    else
      Fog::Logger.warning "Invalid container in dynamic object manifest: #{cname}"
      yield self
    end
  when static_manifest?
    Fog::JSON.decode(body).each do |segment|
      cname, oname = segment['path'].split('/', 2)

      cont = service.mock_container cname
      unless cont
        Fog::Logger.warning "Invalid container in static object manifest: #{cname}"
        next
      end

      obj = cont.mock_object oname
      unless obj
        Fog::Logger.warning "Invalid object in static object manifest: #{oname}"
        next
      end

      yield obj
    end
  else
    yield self
  end
end

#large_object_prefixString?

Access the object name prefix that controls which other objects comprise a dynamic large object.



306
307
308
# File 'lib/fog/rackspace/storage.rb', line 306

def large_object_prefix
  @meta['X-Object-Manifest']
end

#static_manifest?Boolean

Determine if this object was created as a static large object manifest.



235
236
237
# File 'lib/fog/rackspace/storage.rb', line 235

def static_manifest?
  @static_manifest
end

#to_headersHash<String, String>

Construct the fake HTTP headers that should be returned on requests targetting this object. Includes computed `Content-Type`, `Content-Length`, `Last-Modified` and `ETag` headers in addition to whatever metadata has been associated with this object manually.



316
317
318
319
320
321
322
323
# File 'lib/fog/rackspace/storage.rb', line 316

def to_headers
  {
    'Content-Type' => @content_type,
    'Content-Length' => @bytes_used,
    'Last-Modified' => @last_modified.strftime('%a, %b %d %Y %H:%M:%S %Z'),
    'ETag' => @hash
  }.merge(@meta)
end