1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/rackspace/models/compute_v2/metadata.rb
2013-01-30 09:13:27 -06:00

100 lines
3.4 KiB
Ruby

require 'fog/core/collection'
require 'fog/rackspace/models/compute_v2/meta_parent'
require 'fog/rackspace/models/compute_v2/metadatum'
require 'fog/rackspace/models/compute_v2/image'
require 'fog/rackspace/models/compute_v2/server'
module Fog
module Compute
class RackspaceV2
class Metadata < Fog::Collection
model Fog::Compute::RackspaceV2::Metadatum
include Fog::Compute::RackspaceV2::MetaParent
# Retrieves all of the metadata from server
# @return [Array<Fog::Compute::RackspaceV2::Metadatum>] list of metadatum
def all
requires :parent
return unless parent.identity
data = service.list_metadata(collection_name, parent.id).body['metadata']
from_hash(data)
end
# Retrieves specific metadata from server
# @param [String] key for metadatum
# @return [Fog::Compute::RackspaceV2::Metadatum] metadatum
def get(key)
requires :parent
data = service.get_metadata_item(collection_name, parent.id, key).body["meta"]
datum = data.first
new(:key => datum[0], :value => datum[1])
rescue Fog::Compute::RackspaceV2::NotFound
nil
end
# Retrieve specific value for key from Metadata.
# * If key is of type String, this method will return the value of the metadatum
# * If key is of type Fixnum, this method will return a Fog::Compute::RackspaceV2::Metadatum object (legacy)
# @param [#key] key
# @return [#value]
def [](key)
return super(key) if key.is_a?(Integer)
return nil unless key
datum = self.find {|datum| datum.key == key || datum.key == key.to_sym }
datum ? datum.value : nil
end
# Set value for key.
# * If key is of type String, this method will set/add the value to Metadata
# * If key is of type Fixnum, this method will set a Fog::Compute::RackspaceV2::Metadatum object (legacy)
# @param [#key] key
# @return [String]
def []=(key, value)
return super(key,value) if key.is_a?(Integer)
return nil unless key
datum = self.find {|datum| datum.key == key || datum.key == key.to_sym }
if datum
datum.value = value
else
self << Fog::Compute::RackspaceV2::Metadatum.new(:key => key, :value => value, :service => service, :parent => parent)
end
value
end
# Saves the current metadata on server
def save
requires :parent
service.set_metadata(collection_name, parent.id, to_hash)
end
# Creates new metadata
def new(attributes = {})
requires :parent
super({ :parent => parent }.merge!(attributes))
end
# Resets metadata using data from hash
# @param hash hash containing key value pairs used to populate metadata.
# @note This will remove existing data
def from_hash(hash)
return unless hash
metas = []
hash.each_pair {|k,v| metas << {:key => k, :value => v} }
load(metas)
end
# Converts metadata object to hash
# @return [Hash] hash of metadata key value pairs
def to_hash
h = {}
self.each { |datum| h[datum.key] = datum.value }
h
end
end
end
end
end