Class: Fog::Compute::Google::Server

Inherits:
Server
  • Object
show all
Defined in:
lib/fog/compute/google/models/server.rb

Constant Summary collapse

GCE_SCOPE_ALIASES =

Security account scope aliases used by official gcloud utility List derived from ‘gcloud compute instances create –help’

{
  "compute-ro" => "compute.readonly",
  "compute-rw" => "compute",
  "computeaccounts-ro" => "computeaccounts.readonly",
  "computeaccounts-rw" => "computeaccounts",
  "logging-write" => "logging.write",
  "sql" => "sqlservice",
  "sql-admin" => "sqlservice.admin",
  "storage-full" => "devstorage.full_control",
  "storage-ro" => "devstorage.read_only",
  "storage-rw" => "devstorage.read_write"
}

Instance Method Summary collapse

Instance Method Details

#add_ssh_key(username, key) ⇒ Object



201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/fog/compute/google/models/server.rb', line 201

def add_ssh_key(username, key)
  self. = Hash.new("") if .nil?

  # You can have multiple SSH keys, seperated by newlines.
  # https://developers.google.com/compute/docs/console?hl=en#sshkeys
  ["sshKeys"] = "" unless ["sshKeys"]

  ["sshKeys"] += "\n" unless ["sshKeys"].empty?

  ["sshKeys"] += "#{username}:#{key.strip}"

  
end

#addressesObject



119
120
121
# File 'lib/fog/compute/google/models/server.rb', line 119

def addresses
  [private_ip_address, public_ip_address]
end

#attach_disk(disk, options = {}) ⇒ Object



123
124
125
126
127
128
# File 'lib/fog/compute/google/models/server.rb', line 123

def attach_disk(disk, options = {})
  requires :identity, :zone

  data = service.attach_disk(identity, zone_name, disk, options)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#destroy(async = true) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/fog/compute/google/models/server.rb', line 80

def destroy(async = true)
  requires :name, :zone

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

#detach_disk(device_name) ⇒ Object



130
131
132
133
134
135
# File 'lib/fog/compute/google/models/server.rb', line 130

def detach_disk(device_name)
  requires :identity, :zone

  data = service.detach_disk(identity, zone, device_name)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#flavor_idObject



72
73
74
# File 'lib/fog/compute/google/models/server.rb', line 72

def flavor_id
  machine_type
end

#flavor_id=(flavor_id) ⇒ Object



76
77
78
# File 'lib/fog/compute/google/models/server.rb', line 76

def flavor_id=(flavor_id)
  machine_type = flavor_id
end

#imageObject

not used since v1



90
91
92
93
# File 'lib/fog/compute/google/models/server.rb', line 90

def image
  Fog::Logger.deprecation("Server.image is deprecated, get source_image from boot disk")
  service.get_image(image_name.split("/")[-1])
end

#image_nameObject



53
54
55
56
57
58
59
60
61
# File 'lib/fog/compute/google/models/server.rb', line 53

def image_name
  boot_disk = disks.first
  unless boot_disk.is_a?(Disk)
    source = boot_disk["source"]
    match = source.match(%r{/zones/(.*)/disks/(.*)$})
    boot_disk = service.disks.get match[2], match[1]
  end
  boot_disk.source_image.nil? ? nil : boot_disk.source_image
end

#image_name=(_args) ⇒ Object



49
50
51
# File 'lib/fog/compute/google/models/server.rb', line 49

def image_name=(_args)
  Fog::Logger.deprecation("image_name= is no longer used [light_black](#{caller.first})[/]")
end

#kernelObject



67
68
69
70
# File 'lib/fog/compute/google/models/server.rb', line 67

def kernel
  Fog::Logger.deprecation("kernel is no longer used [light_black](#{caller.first})[/]")
  nil
end

#kernel=(_args) ⇒ Object



63
64
65
# File 'lib/fog/compute/google/models/server.rb', line 63

def kernel=(_args)
  Fog::Logger.deprecation("kernel= is no longer used [light_black](#{caller.first})[/]")
end

#map_service_accounts(scope_array) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# File 'lib/fog/compute/google/models/server.rb', line 215

def map_service_accounts(scope_array)
  scope_array_expanded = scope_array.map do |e|
    if GCE_SCOPE_ALIASES[e]
      GCE_SCOPE_ALIASES[e]
    else
      e
    end
  end

  scope_array_finalized = scope_array_expanded.map do |e|
    if e.start_with?("https://")
      e
    else
      "https://www.googleapis.com/auth/#{e}"
    end
  end

  scope_array_finalized
end

#private_ip_addressObject



111
112
113
114
115
116
117
# File 'lib/fog/compute/google/models/server.rb', line 111

def private_ip_address
  ip = nil
  if network_interfaces.respond_to? :first
    ip = network_interfaces.first["networkIP"]
  end
  ip
end

#public_ip_addressObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/fog/compute/google/models/server.rb', line 95

def public_ip_address
  ip = nil
  if network_interfaces.respond_to? :each
    network_interfaces.each do |netif|
      next unless netif["accessConfigs"].respond_to? :each
      netif["accessConfigs"].each do |access_config|
        if access_config["name"] == "External NAT"
          ip = access_config["natIP"]
        end
      end
    end
  end

  ip
end

#ready?Boolean

Returns:

  • (Boolean)


193
194
195
# File 'lib/fog/compute/google/models/server.rb', line 193

def ready?
  state == RUNNING
end

#rebootObject



137
138
139
140
141
142
# File 'lib/fog/compute/google/models/server.rb', line 137

def reboot
  requires :identity, :zone

  data = service.reset_server(identity, zone_name)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#reloadObject



235
236
237
238
# File 'lib/fog/compute/google/models/server.rb', line 235

def reload
  data = service.get_server(name, zone_name).body
  merge_attributes(data)
end

#saveObject



240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'lib/fog/compute/google/models/server.rb', line 240

def save
  requires :name
  requires :machine_type
  requires :zone_name
  requires :disks

  unless service.zones.detect { |zone| zone.name == zone_name }
    raise ArgumentError.new "#{zone_name.inspect} is either down or you don't have permission to use it."
  end

  add_ssh_key(username, public_key) if public_key

  options = {
    "machineType" => machine_type,
    "networkInterfaces" => network_interfaces,
    "network" => network,
    "externalIp" => external_ip,
    "disks" => disks,
    "metadata" => ,
    "serviceAccounts" => service_accounts,
    "tags" => tags,
    "auto_restart" => auto_restart,
    "on_host_maintenance" => on_host_maintenance,
    "preemptible" => preemptible,
    "can_ip_forward" => can_ip_forward
  }.delete_if { |_key, value| value.nil? }

  if service_accounts
    options["serviceAccounts"] = [{
      "kind" => "compute#serviceAccount",
      "email" => "default",
      "scopes" => map_service_accounts(service_accounts)
    }]
  end

  data = service.insert_server(name, zone_name, options)
  operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
  operation.wait_for { !pending? }
  reload
end

#serial_port_outputObject



158
159
160
161
162
163
# File 'lib/fog/compute/google/models/server.rb', line 158

def serial_port_output
  requires :identity, :zone

  data = service.get_server_serial_port_output(identity, zone_name)
  data.body["contents"]
end

#set_disk_auto_delete(auto_delete, device_name) ⇒ Object



165
166
167
168
169
170
# File 'lib/fog/compute/google/models/server.rb', line 165

def set_disk_auto_delete(auto_delete, device_name)
  requires :identity, :zone

  data = service.set_server_disk_auto_delete(identity, zone_name, auto_delete, device_name)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#set_metadata(metadata = {}) ⇒ Object



179
180
181
182
183
184
# File 'lib/fog/compute/google/models/server.rb', line 179

def ( = {})
  requires :identity, :zone

  data = service.(identity, zone_name, self.["fingerprint"], )
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#set_scheduling(on_host_maintenance, automatic_restart, preemptible) ⇒ Object



172
173
174
175
176
177
# File 'lib/fog/compute/google/models/server.rb', line 172

def set_scheduling(on_host_maintenance, automatic_restart, preemptible)
  requires :identity, :zone

  data = service.set_server_scheduling(identity, zone_name, on_host_maintenance, automatic_restart, preemptible)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#set_tags(tags = []) ⇒ Object



186
187
188
189
190
191
# File 'lib/fog/compute/google/models/server.rb', line 186

def set_tags(tags = [])
  requires :identity, :zone

  data = service.set_tags(identity, zone_name, self.tags["fingerprint"], tags)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#startObject



144
145
146
147
148
149
# File 'lib/fog/compute/google/models/server.rb', line 144

def start
  requires :identity, :zone

  data = service.start_server(identity, zone_name)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#stopObject



151
152
153
154
155
156
# File 'lib/fog/compute/google/models/server.rb', line 151

def stop
  requires :identity, :zone

  data = service.stop_server(identity, zone_name)
  Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
end

#zone_nameObject



197
198
199
# File 'lib/fog/compute/google/models/server.rb', line 197

def zone_name
  zone.nil? ? nil : zone.split("/")[-1]
end