Skip to content

Commit

Permalink
Merge pull request #244 from cloud66/master
Browse files Browse the repository at this point in the history
support for SSL certificates, https proxies and global IP addresses
  • Loading branch information
icco authored Aug 29, 2017
2 parents 61632bf + 0c3fd89 commit b4e1ed1
Show file tree
Hide file tree
Showing 20 changed files with 593 additions and 4 deletions.
22 changes: 22 additions & 0 deletions lib/fog/compute/google.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class Google < Fog::Service
request :add_zone_view_resources

request :delete_address
request :delete_global_address
request :delete_backend_service
request :delete_disk
request :delete_firewall
Expand All @@ -58,13 +59,16 @@ class Google < Fog::Service
request :delete_snapshot
request :delete_subnetwork
request :delete_target_http_proxy
request :delete_target_https_proxy
request :delete_target_instance
request :delete_target_pool
request :delete_url_map
request :delete_zone_operation
request :delete_zone_view
request :delete_ssl_certificate

request :get_address
request :get_global_address
request :get_backend_service
request :get_backend_service_health
request :get_disk
Expand All @@ -89,15 +93,18 @@ class Google < Fog::Service
request :get_snapshot
request :get_subnetwork
request :get_target_http_proxy
request :get_target_https_proxy
request :get_target_instance
request :get_target_pool
request :get_target_pool_health
request :get_url_map
request :get_zone
request :get_zone_operation
request :get_zone_view
request :get_ssl_certificate

request :insert_address
request :insert_global_address
request :insert_backend_service
request :insert_disk
request :insert_firewall
Expand All @@ -114,10 +121,12 @@ class Google < Fog::Service
request :insert_snapshot
request :insert_subnetwork
request :insert_target_http_proxy
request :insert_target_https_proxy
request :insert_target_instance
request :insert_target_pool
request :insert_url_map
request :insert_zone_view
request :insert_ssl_certificate

request :list_addresses
request :list_aggregated_addresses
Expand Down Expand Up @@ -150,13 +159,15 @@ class Google < Fog::Service
request :list_snapshots
request :list_subnetworks
request :list_target_http_proxies
request :list_target_https_proxies
request :list_target_instances
request :list_target_pools
request :list_url_maps
request :list_zone_operations
request :list_zone_view_resources
request :list_zone_views
request :list_zones
request :list_ssl_certificates

request :remove_instance_group_instances
request :remove_target_pool_health_checks
Expand All @@ -170,6 +181,8 @@ class Google < Fog::Service
request :set_server_scheduling
request :set_tags
request :set_target_http_proxy_url_map
request :set_target_https_proxy_url_map


request :attach_disk
request :detach_disk
Expand Down Expand Up @@ -198,6 +211,9 @@ class Google < Fog::Service
model :address
collection :addresses

model :global_address
collection :global_addresses

model :operation
collection :operations

Expand Down Expand Up @@ -237,6 +253,9 @@ class Google < Fog::Service
model :target_http_proxy
collection :target_http_proxies

model :target_https_proxy
collection :target_https_proxies

model :url_map
collection :url_maps

Expand All @@ -254,6 +273,9 @@ class Google < Fog::Service

model :subnetwork
collection :subnetworks

model :ssl_certificate
collection :ssl_certificates
end
end
end
88 changes: 88 additions & 0 deletions lib/fog/compute/google/models/global_address.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
module Fog
module Compute
class Google
##
# Represents an Address resource
#
# @see https://developers.google.com/compute/docs/reference/latest/addresses
class GlobalAddress < Fog::Model
identity :name

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

IN_USE_STATE = "IN_USE".freeze
RESERVED_STATE = "RESERVED".freeze

def server
return nil if !in_use? || users.nil? || users.empty?

service.servers.get(users.first.split("/")[-1])
end

def server=(server)
requires :identity
server ? associate(server) : disassociate
end

def save
requires :identity

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

def destroy(async = true)
requires :identity

data = service.delete_global_address(identity)
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], nil)
operation.wait_for { ready? } unless async
operation
end

def reload
requires :identity

data = collection.get(identity)
merge_attributes(data.attributes)
self
end

def in_use?
status == IN_USE_STATE
end

private

def associate(server)
nic = server.network_interfaces.first["name"]
data = service.add_server_access_config(server.name, server.zone_name, nic, :address => address)
Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

def disassociate
return nil if !in_use? || users.nil? || users.empty?

# An address can only be associated with one server at a time
server = service.servers.get(users.first.split("/")[-1])
nic = server.network_interfaces.first["name"]
unless server.network_interfaces.first["accessConfigs"].nil? || server.network_interfaces.first["accessConfigs"].empty?
access_config = server.network_interfaces.first["accessConfigs"].first["name"]
data = service.delete_server_access_config(server.name, server.zone_name, nic,
:access_config => access_config)
Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end
end
end
end
end
end
45 changes: 45 additions & 0 deletions lib/fog/compute/google/models/global_addresses.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module Fog
module Compute
class Google
class GlobalAddresses < Fog::Collection
model Fog::Compute::Google::GlobalAddress

def all(_filters = {})
data = []
service.list_aggregated_addresses.body["items"].each_value do |region|
data.concat(region["addresses"]) if region["addresses"]
end
load(data)
end

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

def get_by_ip_address(ip_address)
addresses = service.list_aggregated_addresses(:filter => "address eq .*#{ip_address}").body["items"]
address = addresses.each_value.select { |region| region.key?("addresses") }

return nil if address.empty?
new(address.first["addresses"].first)
end

def get_by_name(ip_name)
names = service.list_aggregated_addresses(:filter => "name eq .*#{ip_name}").body["items"]
name = names.each_value.select { |region| region.key?("addresses") }

return nil if name.empty?
new(name.first["addresses"].first)
end

def get_by_ip_address_or_name(ip_address_or_name)
get_by_ip_address(ip_address_or_name) || get_by_name(ip_address_or_name)
end
end
end
end
end
35 changes: 35 additions & 0 deletions lib/fog/compute/google/models/ssl_certificate.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module Fog
module Compute
class Google
##
# Represents a Subnetwork resource
#
# @see https://cloud.google.com/compute/docs/reference/latest/sslCertificates
class SslCertificate < Fog::Model
identity :name
attribute :id
attribute :creation_timestamp, :aliases => "creationTimestamp"
attribute :description
attribute :self_link, :aliases => "selfLink"
attribute :certificate
attribute :private_key, :aliases => "privateKey"

def save
requires :identity, :certificate, :private_key
data = service.insert_ssl_certificate(identity, certificate, private_key, attributes)
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], nil)
operation.wait_for { !pending? }
reload
end

def destroy(async = true)
requires :identity
data = service.delete_ssl_certificate(identity)
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], nil)
operation.wait_for { ready? } unless async
operation
end
end
end
end
end
22 changes: 22 additions & 0 deletions lib/fog/compute/google/models/ssl_certificates.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Fog
module Compute
class Google
class SslCertificates < Fog::Collection
model Fog::Compute::Google::SslCertificate

def get(certificate_name)
if certificate = service.get_ssl_certificate(certificate_name).body
new(certificate)
end
rescue Fog::Errors::NotFound
nil
end

def all(_filters = {})
data = service.list_ssl_certificates.body["items"] || []
load(data)
end
end
end
end
end
8 changes: 4 additions & 4 deletions lib/fog/compute/google/models/target_http_proxy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def save

options = {
"description" => description,
"urlMap" => url_map
"urlMap" => url_map
}

data = service.insert_target_http_proxy(name, options).body
Expand All @@ -38,8 +38,8 @@ def destroy(async = true)
operation
end

def set_url_map(urlMap)
operation = service.set_target_http_proxy_url_map(self, urlMap)
def set_url_map(url_map)
service.set_target_http_proxy_url_map(self, url_map)
reload
end

Expand All @@ -64,7 +64,7 @@ def reload
self
end

RUNNING_STATE = "READY"
RUNNING_STATE = "READY".freeze
end
end
end
Expand Down
22 changes: 22 additions & 0 deletions lib/fog/compute/google/models/target_https_proxies.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Fog
module Compute
class Google
class TargetHttpsProxies < Fog::Collection
model Fog::Compute::Google::TargetHttpsProxy

def all(_filters = {})
data = service.list_target_https_proxies.body["items"] || []
load(data)
end

def get(identity)
if target_https_proxy = service.get_target_https_proxy(identity).body
new(target_https_proxy)
end
rescue Fog::Errors::NotFound
nil
end
end
end
end
end
Loading

0 comments on commit b4e1ed1

Please sign in to comment.