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



214
215
216
# File 'lib/fog/compute/google/models/server.rb', line 214

def add_ssh_key(username, key)
  ((username, key))
end

#addressesObject



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

def addresses
  [private_ip_address, public_ip_address]
end

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



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

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



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

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



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

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



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

def flavor_id
  machine_type
end

#flavor_id=(flavor_id) ⇒ Object



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

def flavor_id=(flavor_id)
  machine_type = flavor_id
end

#imageObject

not used since v1



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

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



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

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



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

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

#kernelObject



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

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

#kernel=(_args) ⇒ Object



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

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

#map_service_accounts(scope_array) ⇒ Object



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

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



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

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

#provisioning?Boolean

Returns:

  • (Boolean)


202
203
204
# File 'lib/fog/compute/google/models/server.rb', line 202

def provisioning?
  state == PROVISIONING
end

#public_ip_addressObject



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

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)


206
207
208
# File 'lib/fog/compute/google/models/server.rb', line 206

def ready?
  state == RUNNING
end

#rebootObject



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

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



238
239
240
241
# File 'lib/fog/compute/google/models/server.rb', line 238

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

#saveObject



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
280
281
282
283
# File 'lib/fog/compute/google/models/server.rb', line 243

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

  (username, public_key) if public_key

  options = {
    "machineType" => machine_type,
    "networkInterfaces" => network_interfaces,
    "network" => network,
    "subnetwork" => subnetwork,
    "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



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

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 = nil) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/fog/compute/google/models/server.rb', line 166

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

  unless device_name
    if disks.count <= 1
      device_name = disks[0]["deviceName"]
    else
      raise ArgumentError.new("Device name required if multiple disks are attached")
    end
  end

  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



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

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



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

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



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

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



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

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



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

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



210
211
212
# File 'lib/fog/compute/google/models/server.rb', line 210

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