module Fog module Compute class Google class Disk < Fog::Model identity :name attribute :kind attribute :id attribute :creation_timestamp, :aliases => "creationTimestamp" attribute :zone, :aliases => :zone_name attribute :status attribute :description attribute :size_gb, :aliases => "sizeGb" attribute :self_link, :aliases => "selfLink" attribute :source_image, :aliases => "sourceImage" attribute :source_image_id, :aliases => "sourceImageId" attribute :source_snapshot, :aliases => "sourceSnapshot" attribute :source_snapshot_id, :aliases => "sourceSnapshotId" attribute :type attribute :labels attribute :label_fingerprint, :aliases => "labelFingerprint" attribute :users def default_description if !source_image.nil? "created from image: #{source_image}" elsif !source_snapshot.nil? "created from snapshot: #{source_snapshot}" else "created with fog" end end def save requires :name, :zone, :size_gb options = { :description => description || default_description, :type => type, :size_gb => size_gb, :source_image => source_image, :source_snapshot => source_snapshot, :labels => labels }.reject { |_, v| v.nil? } if options[:source_image] unless source_image.include?("projects/") options[:source_image] = service.images.get(source_image).self_link end end # Request needs backward compatibility so source image is specified in # method arguments data = service.insert_disk(name, zone, options[:source_image], **options) operation = Fog::Compute::Google::Operations.new(service: service) .get(data.name, data.zone) operation.wait_for { ready? } reload end def destroy(async = true) requires :name, :zone data = service.delete_disk(name, zone_name) operation = Fog::Compute::Google::Operations.new(:service => service) .get(data.name, data.zone) operation.wait_for { ready? } unless async operation end def zone_name zone.nil? ? nil : zone.split("/")[-1] end # Returns an attached disk configuration hash. # # Compute API needs attached disks to be specified in a custom format. # This provides a handy shortcut for generating a preformatted config. # # Example output: # {:auto_delete=>false, # :boot=>true, # :mode=>"READ_WRITE", # :source=>"https://www.googleapis.com/compute/v1/projects/myproj/zones/us-central1-f/disks/mydisk", # :type=>"PERSISTENT"} # # See Instances.insert API docs for more info: # https://cloud.google.com/compute/docs/reference/rest/v1/instances/insert # # @param [Hash] opts options to attach the disk with. # @option opts [Boolean] :writable The mode in which to attach this # disk. (defaults to READ_WRITE) # @option opts [Boolean] :boot Indicates whether this is a boot disk. # (defaults to false) # @option opts [String] :device_name Specifies a unique device name # of your choice that is reflected into the /dev/disk/by-id/google-* # tree of a Linux operating system running within the instance. # @option opts [Object] :encryption_key Encrypts or decrypts a disk # using a customer-supplied encryption key. # @option opts [Object] :auto_delete Specifies whether the disk will # be auto-deleted when the instance is deleted. (defaults to false) # # @return [Hash] Attached disk configuration hash def attached_disk_obj(opts = {}) requires :self_link collection.attached_disk_obj(self_link, **opts) end # A legacy shorthand for attached_disk_obj # # @param [Object] writable The mode in which to attach this disk. # (defaults to READ_WRITE) # @param [Object] auto_delete Specifies whether the disk will be # auto-deleted when the instance is deleted. (defaults to false) # @return [Hash] def get_as_boot_disk(writable = true, auto_delete = false) attached_disk_obj(boot: true, writable: writable, auto_delete: auto_delete) end def ready? status == RUNNING_STATE end def reload requires :identity, :zone return unless data = begin collection.get(identity, zone_name) rescue Google::Apis::TransmissionError nil end new_attributes = data.attributes merge_attributes(new_attributes) self end def create_snapshot(snapshot_name, snapshot = {}) requires :name, :zone raise ArgumentError, "Invalid snapshot name" unless snapshot_name data = service.create_disk_snapshot(snapshot_name, name, zone_name, snapshot) operation = Fog::Compute::Google::Operations.new(:service => service) .get(data.name, data.zone) operation.wait_for { ready? } service.snapshots.get(snapshot_name) end RUNNING_STATE = "READY".freeze end end end end