Class: Fog::Compute::Google::Real
- Inherits:
-
Object
- Object
- Fog::Compute::Google::Real
- Includes:
- Collections
- Defined in:
- lib/fog/google/compute.rb,
lib/fog/google/requests/compute/get_disk.rb,
lib/fog/google/requests/compute/get_zone.rb,
lib/fog/google/requests/compute/get_image.rb,
lib/fog/google/requests/compute/get_server.rb,
lib/fog/google/requests/compute/list_disks.rb,
lib/fog/google/requests/compute/list_zones.rb,
lib/fog/google/requests/compute/delete_disk.rb,
lib/fog/google/requests/compute/get_network.rb,
lib/fog/google/requests/compute/insert_disk.rb,
lib/fog/google/requests/compute/list_images.rb,
lib/fog/google/requests/compute/delete_image.rb,
lib/fog/google/requests/compute/get_firewall.rb,
lib/fog/google/requests/compute/get_snapshot.rb,
lib/fog/google/requests/compute/insert_image.rb,
lib/fog/google/requests/compute/list_servers.rb,
lib/fog/google/requests/compute/set_metadata.rb,
lib/fog/google/requests/compute/delete_server.rb,
lib/fog/google/requests/compute/insert_server.rb,
lib/fog/google/requests/compute/list_networks.rb,
lib/fog/google/requests/compute/delete_network.rb,
lib/fog/google/requests/compute/insert_network.rb,
lib/fog/google/requests/compute/list_firewalls.rb,
lib/fog/google/requests/compute/list_snapshots.rb,
lib/fog/google/requests/compute/delete_firewall.rb,
lib/fog/google/requests/compute/insert_firewall.rb,
lib/fog/google/requests/compute/delete_operation.rb,
lib/fog/google/requests/compute/get_machine_type.rb,
lib/fog/google/requests/compute/list_machine_types.rb,
lib/fog/google/requests/compute/list_zone_operations.rb,
lib/fog/google/requests/compute/list_global_operations.rb
Instance Attribute Summary collapse
-
#project ⇒ Object
readonly
Returns the value of attribute project.
Instance Method Summary collapse
- #backoff_if_unfound(&block) ⇒ Object
- #build_response(result) ⇒ Object
- #build_result(api_method, parameters, body_object = nil) ⇒ Object
- #delete_disk(disk_name, zone_name) ⇒ Object
- #delete_firewall(firewall_name) ⇒ Object
- #delete_image(image_name) ⇒ Object
- #delete_network(network_name) ⇒ Object
- #delete_operation(operation_name) ⇒ Object
- #delete_server(server_name, zone_name = nil) ⇒ Object
- #format_metadata(metadata) ⇒ Object
- #get_disk(disk_name, zone_name) ⇒ Object
- #get_firewall(firewall_name) ⇒ Object
- #get_image(image_name, project = @project) ⇒ Object
- #get_machine_type(machine_type_name) ⇒ Object
- #get_network(network_name) ⇒ Object
- #get_server(server_name, zone_name) ⇒ Object
- #get_snapshot(snap_name, project = @project) ⇒ Object
- #get_zone(zone_name) ⇒ Object
-
#initialize(options) ⇒ Real
constructor
A new instance of Real.
- #insert_disk(disk_name, zone_name, image_name = nil, opts = {}) ⇒ Object
- #insert_firewall(firewall_name, source_range, allowed, network = @default_network) ⇒ Object
- #insert_image(image_name, options = {}) ⇒ Object
- #insert_network(network_name, ip_range) ⇒ Object
- #insert_server(server_name, zone_name, options = {}, *deprecated_args) ⇒ Object
- #list_disks(zone_name) ⇒ Object
- #list_firewalls ⇒ Object
- #list_global_operations ⇒ Object
- #list_images(project = nil) ⇒ Object
- #list_machine_types(zone_name) ⇒ Object
- #list_networks ⇒ Object
- #list_servers(zone_name) ⇒ Object
- #list_snapshots(project = nil) ⇒ Object
- #list_zone_operations(zone) ⇒ Object
- #list_zones ⇒ Object
- #set_metadata(instance, zone, metadata = {}) ⇒ Object
Constructor Details
#initialize(options) ⇒ Real
Returns a new instance of Real.
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/fog/google/compute.rb', line 78 def initialize() base_url = 'https://www.googleapis.com/compute/' api_version = 'v1beta15' api_scope_url = 'https://www.googleapis.com/auth/compute' @project = [:google_project] google_client_email = [:google_client_email] @api_url = base_url + api_version + '/projects/' # NOTE: loaded here to avoid requiring this as a core Fog dependency begin require 'google/api_client' rescue LoadError Fog::Logger.warning("Please install the google-api-client gem before using this provider.") end key = ::Google::APIClient::KeyUtils.load_from_pkcs12(File.([:google_key_location]), 'notasecret') @client = ::Google::APIClient.new({ :application_name => "fog", :application_version => Fog::VERSION, }) @client. = Signet::OAuth2::Client.new({ :audience => 'https://accounts.google.com/o/oauth2/token', :auth_provider_x509_cert_url => "https://www.googleapis.com/oauth2/v1/certs", :client_x509_cert_url => "https://www.googleapis.com/robot/v1/metadata/x509/#{google_client_email}", :issuer => google_client_email, :scope => api_scope_url, :signing_key => key, :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', }) @client..fetch_access_token! @compute = @client.discovered_api('compute', api_version) @default_network = 'default' end |
Instance Attribute Details
#project ⇒ Object (readonly)
Returns the value of attribute project.
76 77 78 |
# File 'lib/fog/google/compute.rb', line 76 def project @project end |
Instance Method Details
#backoff_if_unfound(&block) ⇒ Object
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/fog/google/compute.rb', line 145 def backoff_if_unfound(&block) retries_remaining = 10 begin result = block.call rescue Exception => msg if msg.to_s.include? 'was not found' and retries_remaining > 0 retries_remaining -= 1 sleep 0.1 retry else raise msg end end result end |
#build_response(result) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/fog/google/compute.rb', line 130 def build_response(result) response = Excon::Response.new response.body = Fog::JSON.decode(result.body) if response.body["error"] response.status = response.body["error"]["code"] response.body["error"]["errors"].each do |error| raise Fog::Errors::Error.new(error["message"]) end else response.status = 200 end response end |
#build_result(api_method, parameters, body_object = nil) ⇒ Object
115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/fog/google/compute.rb', line 115 def build_result(api_method, parameters, body_object=nil) if body_object result = @client.execute( :api_method => api_method, :parameters => parameters, :body_object => body_object ) else result = @client.execute( :api_method => api_method, :parameters => parameters ) end end |
#delete_disk(disk_name, zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/fog/google/requests/compute/delete_disk.rb', line 15 def delete_disk(disk_name, zone_name) if zone_name.start_with? 'http' zone_name = zone_name.split('/')[-1] end api_method = @compute.disks.delete parameters = { 'project' => @project, 'disk' => disk_name, 'zone' => zone_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#delete_firewall(firewall_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/delete_firewall.rb', line 15 def delete_firewall(firewall_name) api_method = @compute.firewalls.delete parameters = { 'project' => @project, 'firewall' => firewall_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#delete_image(image_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/delete_image.rb', line 15 def delete_image(image_name) api_method = @compute.images.delete parameters = { 'project' => @project, 'image' => image_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#delete_network(network_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/delete_network.rb', line 15 def delete_network(network_name) api_method = @compute.networks.delete parameters = { 'project' => @project, 'network' => network_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#delete_operation(operation_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/delete_operation.rb', line 15 def delete_operation(operation_name) api_method = @compute.operations.delete parameters = { 'project' => @project, 'operation' => operation_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#delete_server(server_name, zone_name = nil) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/fog/google/requests/compute/delete_server.rb', line 15 def delete_server(server_name, zone_name=nil) if zone_name.nil? list_zones.body['items'].each do |zone| if get_server(server_name, zone['name']).status == 200 zone_name = zone['name'] end end else if zone_name.is_a? Excon::Response zone_name = zone_name.body["name"] end end api_method = @compute.instances.delete parameters = { 'project' => @project, 'zone' => zone_name, 'instance' => server_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#format_metadata(metadata) ⇒ Object
15 16 17 |
# File 'lib/fog/google/requests/compute/insert_server.rb', line 15 def () { "items" => .map {|k,v| {"key" => k, "value" => v}} } end |
#get_disk(disk_name, zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/fog/google/requests/compute/get_disk.rb', line 15 def get_disk(disk_name, zone_name) if zone_name.start_with? 'http' zone_name = zone_name.split('/')[-1] end api_method = @compute.disks.get parameters = { 'project' => @project, 'disk' => disk_name, 'zone' => zone_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_firewall(firewall_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/get_firewall.rb', line 15 def get_firewall(firewall_name) api_method = @compute.firewalls.get parameters = { 'project' => @project, 'firewall' => firewall_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_image(image_name, project = @project) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/get_image.rb', line 15 def get_image(image_name, project=@project) api_method = @compute.images.get parameters = { 'image' => image_name, 'project' => project, } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_machine_type(machine_type_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/get_machine_type.rb', line 15 def get_machine_type(machine_type_name) api_method = @compute.machine_types.get parameters = { 'project' => 'google', 'machineType' => machine_type_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_network(network_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/get_network.rb', line 15 def get_network(network_name) api_method = @compute.networks.get parameters = { 'project' => @project, 'network' => network_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_server(server_name, zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/fog/google/requests/compute/get_server.rb', line 15 def get_server(server_name, zone_name) if zone_name.is_a? Excon::Response zone = zone_name.body["name"] else zone = zone_name end api_method = @compute.instances.get parameters = { 'project' => @project, 'zone' => zone, 'instance' => server_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_snapshot(snap_name, project = @project) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/fog/google/requests/compute/get_snapshot.rb', line 15 def get_snapshot(snap_name, project=@project) if snap_name.nil? raise ArgumentError.new "snap_name must not be nil." end api_method = @compute.snapshots.get parameters = { 'snapshot' => snap_name, 'project' => project, } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#get_zone(zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/get_zone.rb', line 15 def get_zone(zone_name) api_method = @compute.zones.get parameters = { 'project' => @project, 'zone' => zone_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#insert_disk(disk_name, zone_name, image_name = nil, opts = {}) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/fog/google/requests/compute/insert_disk.rb', line 15 def insert_disk(disk_name, zone_name, image_name=nil, opts={}) api_method = @compute.disks.insert parameters = { 'project' => @project, 'zone' => zone_name } if image_name image = images.get(image_name) raise ArgumentError.new('Invalid image specified') unless image @image_url = @api_url + image.resource_url parameters['sourceImage'] = @image_url end body_object = { 'name' => disk_name } # These must be present if image_name is not specified if image_name.nil? unless opts.has_key?('sourceSnapshot') and opts.has_key?('sizeGb') raise ArgumentError.new('Must specify image OR snapshot and '\ 'disk size when creating a disk.') end body_object['sizeGb'] = opts.delete('sizeGb') snap = snapshots.get(opts.delete('sourceSnapshot')) raise ArgumentError.new('Invalid source snapshot') unless snap body_object['sourceSnapshot'] = @api_url + snap.resource_url end # Merge in any remaining options (only 'description' should remain) body_object.merge(opts) result = self.build_result(api_method, parameters, body_object) response = self.build_response(result) end |
#insert_firewall(firewall_name, source_range, allowed, network = @default_network) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/fog/google/requests/compute/insert_firewall.rb', line 15 def insert_firewall(firewall_name, source_range, allowed, network=@default_network) api_method = @compute.firewalls.insert parameters = { 'project' => @project, } body_object = { "name" => firewall_name, "network" => "#{@api_url}#{@project}/global/networks/#{network}", "sourceRanges" => source_range, "allowed" => allowed } result = self.build_result(api_method, parameters, body_object=body_object) response = self.build_response(result) end |
#insert_image(image_name, options = {}) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/fog/google/requests/compute/insert_image.rb', line 15 def insert_image(image_name, ={}) api_method = @compute.images.insert parameters = { 'project' => @project, } kernel_url = @api_url + 'google/global/kernels/' + \ .delete('preferredKernel').to_s body_object = { 'sourceType' => 'RAW', 'name' => image_name, 'rawDisk' => .delete('rawDisk'), 'preferredKernel' => kernel_url, } # Merge in the remaining params (only 'description' should remain) body_object.merge() result = self.build_result(api_method, parameters, body_object=body_object) response = self.build_response(result) end |
#insert_network(network_name, ip_range) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/fog/google/requests/compute/insert_network.rb', line 15 def insert_network(network_name, ip_range) api_method = @compute.networks.insert parameters = { 'project' => @project, } body_object = { 'name' => network_name, 'IPv4Range' => ip_range } result = self.build_result(api_method, parameters, body_object=body_object) response = self.build_response(result) end |
#insert_server(server_name, zone_name, options = {}, *deprecated_args) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/fog/google/requests/compute/insert_server.rb', line 19 def insert_server(server_name, zone_name, ={}, *deprecated_args) if deprecated_args.length > 0 or not .is_a? Hash raise ArgumentError.new 'Too many parameters specified. This may be the cause of code written for an outdated'\ ' version of fog. Usage: server_name, zone_name, [options]' end api_method = @compute.instances.insert parameters = { 'project' => @project, 'zone' => zone_name, } body_object = {:name => server_name} if .has_key? 'image' image_name = .delete 'image' image = images.get(image_name) @image_url = @api_url + image.resource_url body_object['image'] = @image_url end body_object['machineType'] = @api_url + @project + "/zones/#{zone_name}/machineTypes/#{.delete 'machineType'}" network = nil if .has_key? 'network' network = .delete 'network' elsif @default_network network = @default_network end # ExternalIP is default value for server creation if .has_key? 'externalIp' external_ip = .delete 'externalIp' else external_ip = true end networkInterfaces = [] if ! network.nil? networkInterface = { 'network' => @api_url + @project + "/global/networks/#{network}" } if external_ip networkInterface['accessConfigs'] = [{'type' => 'ONE_TO_ONE_NAT', 'name' => 'External NAT'}] end networkInterfaces << networkInterface end # TODO: add other networks body_object['networkInterfaces'] = networkInterfaces if ['disks'] disks = [] .delete('disks').each do |disk| if disk.is_a? Disk disks << disk.get_object else disks << disk end end body_object['disks'] = disks end ['metadata'] = ['metadata'] if ['metadata'] if ['kernel'] body_object['kernel'] = @api_url + "google/global/kernels/#{.delete 'kernel'}" end body_object.merge! # Adds in all remaining options that weren't explicitly handled. result = self.build_result(api_method, parameters, body_object=body_object) response = self.build_response(result) end |
#list_disks(zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_disks.rb', line 15 def list_disks(zone_name) api_method = @compute.disks.list parameters = { 'project' => @project, 'zone' => zone_name } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_firewalls ⇒ Object
15 16 17 18 19 20 21 22 23 |
# File 'lib/fog/google/requests/compute/list_firewalls.rb', line 15 def list_firewalls api_method = @compute.firewalls.list parameters = { 'project' => @project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_global_operations ⇒ Object
16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_global_operations.rb', line 16 def list_global_operations api_method = @compute.global_operations.list parameters = { 'project' => @project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_images(project = nil) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_images.rb', line 15 def list_images(project=nil) api_method = @compute.images.list project=@project if project.nil? parameters = { 'project' => project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_machine_types(zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_machine_types.rb', line 15 def list_machine_types(zone_name) api_method = @compute.machine_types.list parameters = { 'project' => @project, 'zone' => zone_name, } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_networks ⇒ Object
15 16 17 18 19 20 21 22 23 |
# File 'lib/fog/google/requests/compute/list_networks.rb', line 15 def list_networks api_method = @compute.networks.list parameters = { 'project' => @project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_servers(zone_name) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_servers.rb', line 15 def list_servers(zone_name) api_method = @compute.instances.list parameters = { 'project' => @project, 'zone' => zone_name, } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_snapshots(project = nil) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_snapshots.rb', line 15 def list_snapshots(project=nil) api_method = @compute.snapshots.list project=@project if project.nil? parameters = { 'project' => project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_zone_operations(zone) ⇒ Object
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/fog/google/requests/compute/list_zone_operations.rb', line 15 def list_zone_operations(zone) api_method = @compute.zone_operations.list parameters = { 'zone' => zone, 'project' => @project, } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#list_zones ⇒ Object
15 16 17 18 19 20 21 22 23 |
# File 'lib/fog/google/requests/compute/list_zones.rb', line 15 def list_zones api_method = @compute.zones.list parameters = { 'project' => @project } result = self.build_result(api_method, parameters) response = self.build_response(result) end |
#set_metadata(instance, zone, metadata = {}) ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/fog/google/requests/compute/set_metadata.rb', line 15 def (instance, zone, ={}) api_method = @compute.instance. parameters = { 'project' => @project, 'instance' => instance, 'zone' => zone, } body_object = { "items" => .to_a.map {|pair| { :key => pair[0], :value => pair[1] } } } result = self.build_result( api_method, parameters, body_object=body_object) response = self.build_response(result) end |