class NixAdm::ZFS::ZfsEntity

Attributes

host[R]
pool[R]

Public Class Methods

new(host, pool, name) click to toggle source
Calls superclass method NixAdm::ZFS::Object::new
# File src/lib/nixadm/zfs.rb, line 221
def initialize(host, pool, name)
  super host, name

  if pool.is_a?(Pool) == false
    raise 'Second argument must be pool'
  end

  @pool = pool
end

Public Instance Methods

createSnapshot(id=nil) click to toggle source

Creates a snapshot using epoch time as name

# File src/lib/nixadm/zfs.rb, line 313
def createSnapshot(id=nil)
  name = newSnapshotName(id)

  command = @host.resolveCommand("zfs snapshot #{name}")
  if @host.run(command) == false
    raise "Failed to create snapshot #{name}"
  end

  return name.split('@')[1].to_i
end
deleteAllSnapshots() click to toggle source
# File src/lib/nixadm/zfs.rb, line 333
def deleteAllSnapshots()
  snapshotIds().each do |id|
    if deleteSnapshot(id) == false
      return status()
    end
  end

  return success()
end
deleteSnapshot(id) click to toggle source
# File src/lib/nixadm/zfs.rb, line 324
def deleteSnapshot(id)
  name    = snapshotName(id)
  command = @host.resolveCommand("zfs destroy #{name}")

  if @host.run(command) == false
    raise "Failed to create snapshot #{name}"
  end
end
lastSnapshot() click to toggle source
# File src/lib/nixadm/zfs.rb, line 283
def lastSnapshot()
  id = lastSnapshotId()

  return nil if id.nil?

  return snapshot(id)
end
lastSnapshotId() click to toggle source
# File src/lib/nixadm/zfs.rb, line 279
def lastSnapshotId()
  return snapshotIds()[-1]
end
latestMatchingSnapshotId(ids) click to toggle source

Given a set of snapshots in order, returns the most recent match if one exists.

# File src/lib/nixadm/zfs.rb, line 354
def latestMatchingSnapshotId(ids)
  my_ids = snapshotIds()
  ids.reverse_each do |id|
    if my_ids.include?(id)
      return id
    end
  end

  return nil
end
previousSnapshotId(id) click to toggle source
# File src/lib/nixadm/zfs.rb, line 300
def previousSnapshotId(id)
  ids = snapshotIds()

  prev = nil
  ids.each do |x|
    if x == id
      return prev
    end
    prev = x
  end
end
snapshot(id) click to toggle source
# File src/lib/nixadm/zfs.rb, line 231
def snapshot(id)
  snap_names = snapshotNames()

  snap_names.each do |name|
    if name.split('@')[1].to_i == id
      return snapshotInstance(name)
    end
  end

  return nil
end
snapshotIds() click to toggle source
# File src/lib/nixadm/zfs.rb, line 265
def snapshotIds()
  snaps = snapshotNames()

  # We assume that relavant snapshot names are numerical values (epoch
  # times). Any name containing alpha characters will be reduced to 0 by
  # to_i().
  ids = snaps.collect { |s| s.split('@')[1].to_i }

  # Filter out the zero integer value entries, if any
  ids.select! { |s| s > 0 }

  return ids.sort
end
snapshotInstance(name) click to toggle source

Makes testing easier

# File src/lib/nixadm/zfs.rb, line 296
def snapshotInstance(name)
  return Snapshot.new(self, name)
end
snapshotName(ss) click to toggle source
# File src/lib/nixadm/zfs.rb, line 291
def snapshotName(ss)
  return "#{@pool.name}/#{@name}@#{ss}"
end
snapshotNames() click to toggle source

Convert snapshot integers to full names

# File src/lib/nixadm/zfs.rb, line 261
def snapshotNames()
  return filterSnapshots(fetchSnapshots())
end
snapshots() { |snapshot| ... } click to toggle source
# File src/lib/nixadm/zfs.rb, line 243
def snapshots()
  snap_names = snapshotNames()

  objects = []
  snap_names.each do |name|
    snapshot = snapshotInstance(name)

    if block_given?
      yield snapshot
    else
      objects << snapshot
    end
  end

  return objects
end
trimSnapshots() click to toggle source

Delete all except the most recent snapshot

# File src/lib/nixadm/zfs.rb, line 344
def trimSnapshots()
  snapshotIds()[0..-2].each do |id|
    deleteSnapshot(id)
  end

  return success()
end

Private Instance Methods

fetchSnapshots() click to toggle source
# File src/lib/nixadm/zfs.rb, line 367
def fetchSnapshots()
  return @pool.objects('snapshot')
end
filterSnapshots(data) click to toggle source
# File src/lib/nixadm/zfs.rb, line 379
def filterSnapshots(data)
  filter = []
  data.each do |entry|
    fs = entry[:name].split('/')[1..-1].join('/')
    if fs.match(/^#{@name}@/) != nil
      filter << fs
    end
  end

  return filter
end
newSnapshotName(id=nil) click to toggle source
# File src/lib/nixadm/zfs.rb, line 371
def newSnapshotName(id=nil)
  if not id.nil?
    return "#{@pool.name}/#{@name}@#{id}"
  end

  return "#{@pool.name}/#{@name}@#{Time.now.to_i}"
end