Skip to content

Commit

Permalink
[google|compute] Add Addresses support
Browse files Browse the repository at this point in the history
- Add "Addresses" model and collection
- Add "list_aggregated_addresses" request
- Modify "insert" request to allow "description" property
  • Loading branch information
frodenas committed Apr 10, 2014
1 parent 19c5174 commit 061a7ae
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 4 deletions.
4 changes: 4 additions & 0 deletions lib/fog/google/compute.rb
Expand Up @@ -10,6 +10,7 @@ class Google < Fog::Service
request_path 'fog/google/requests/compute'
request :list_servers
request :list_addresses
request :list_aggregated_addresses
request :list_disks
request :list_firewalls
request :list_images
Expand Down Expand Up @@ -66,6 +67,9 @@ class Google < Fog::Service
model :disk
collection :disks

model :address
collection :addresses

model :operation
collection :operations

Expand Down
58 changes: 58 additions & 0 deletions lib/fog/google/models/compute/address.rb
@@ -0,0 +1,58 @@
require 'fog/core/model'

module Fog
module Compute
class Google

##
# Represents an Address resource
#
# @see https://developers.google.com/compute/docs/reference/latest/addresses
class Address < Fog::Model
identity :name

attribute :kind
attribute :id
attribute :address
attribute :creation_timestamp, :aliases => 'creationTimestamp'
attribute :description
attribute :region
attribute :self_link, :aliases => 'selfLink'
attribute :status
attribute :users

IN_USE_STATE = 'IN_USE'
RESERVED_STATE = 'RESERVED'

def save
requires :identity, :region

data = service.insert_address(identity, self.region, self.attributes)
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body['name'], nil, data.body['region'])
operation.wait_for { !pending? }
reload
end

def destroy
requires :identity, :region

data = service.delete_address(identity, self.region.split('/')[-1])
Fog::Compute::Google::Operations.new(:service => service).get(data.body['name'], nil, data.body['region'])
end

def reload
requires :identity, :region

data = collection.get(identity, self.region.split('/')[-1])
merge_attributes(data.attributes)
self
end

def in_use?
self.status == IN_USE_STATE
end
end

end
end
end
34 changes: 34 additions & 0 deletions lib/fog/google/models/compute/addresses.rb
@@ -0,0 +1,34 @@
require 'fog/core/collection'
require 'fog/google/models/compute/address'

module Fog
module Compute
class Google

class Addresses < Fog::Collection
model Fog::Compute::Google::Address

def all(filters = {})
if filters[:region]
data = service.list_addresses(filters[:region]).body['items'] || []
else
data = []
service.list_aggregated_addresses.body['items'].each_value do |region|
data.concat(region['addresses']) if region['addresses']
end
end
load(data)
end

def get(identity, region)
if address = service.get_address(identity, region).body
new(address)
end
rescue Fog::Errors::NotFound
nil
end
end

end
end
end
8 changes: 4 additions & 4 deletions lib/fog/google/requests/compute/insert_address.rb
Expand Up @@ -4,24 +4,24 @@ class Google

class Mock

def insert_address(address_name, region_name)
def insert_address(address_name, region_name, options = {})
Fog::Mock.not_implemented
end

end

class Real

def insert_address(address_name, region_name)
def insert_address(address_name, region_name, options = {})
api_method = @compute.addresses.insert
parameters = {
'project' => @project,
'region' => region_name,
}
body_object = { 'name' => address_name }
body_object['description'] = options[:description] if options[:description]

result = self.build_result(api_method, parameters,
body_object=body_object)
result = self.build_result(api_method, parameters, body_object)
response = self.build_response(result)
end
end
Expand Down
25 changes: 25 additions & 0 deletions lib/fog/google/requests/compute/list_aggregated_addresses.rb
@@ -0,0 +1,25 @@
module Fog
module Compute
class Google

class Mock
def list_aggregated_addresses
Fog::Mock.not_implemented
end
end

class Real
def list_aggregated_addresses
api_method = @compute.addresses.aggregated_list
parameters = {
'project' => @project,
}

result = self.build_result(api_method, parameters)
response = self.build_response(result)
end
end

end
end
end

0 comments on commit 061a7ae

Please sign in to comment.