Skip to content

Commit

Permalink
Merge pull request #2846 from frodenas/gce_addresses
Browse files Browse the repository at this point in the history
[google|compute] Add Addresses support
  • Loading branch information
icco committed Apr 11, 2014
2 parents 85a9d68 + 0a05ba6 commit bba773e
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 4 deletions.
4 changes: 4 additions & 0 deletions lib/fog/google/compute.rb
Original file line number Diff line number Diff line change
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 @@ -93,6 +94,9 @@ class Google < Fog::Service
model :disk
collection :disks

model :address
collection :addresses

model :operation
collection :operations

Expand Down
62 changes: 62 additions & 0 deletions lib/fog/google/models/compute/address.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
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(async=true)
requires :identity, :region

data = service.delete_address(identity, self.region.split('/')[-1])
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body['name'], nil, data.body['region'])
unless async
operation.wait_for { ready? }
end
operation
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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 bba773e

Please sign in to comment.