class Pipette module Commands # cmd_opts: # # size: Size of each volume, in GB # name: Name of the volume group to create # ebs_per_mirror: Number of EBS volumes to put in each mirrored disk. Default 2. # num_mirrors: Number of mirrors to create, to be spanned by the volume group. Default 2. def init(cmd_opts) raise "No volume group name specified" unless cmd_opts[:name] raise "No EBS volume size specified" unless cmd_opts[:size] md_devs = create_mirrors(cmd_opts[:size], cmd_opts[:num_mirrors], cmd_opts[:ebs_per_mirror]) vg_create cmd_opts[:name], md_devs end def append(cmd_opts) raise "No volume group name specified" unless cmd_opts[:name] raise "No EBS volume size specified" unless cmd_opts[:size] md_devs = create_mirrors(cmd_opts[:size], cmd_opts[:num_mirrors], cmd_opts[:ebs_per_mirror]) vg_extend cmd_opts[:name], md_devs end def add(cmd_opts) raise "No logical volume name specified" unless cmd_opts[:name] raise "No logical volume size specified" unless cmd_opts[:size] raise "No volume group name specified" unless cmd_opts[:volume] dev = lv_create(cmd_opts[:name], cmd_opts[:volume], cmd_opts[:size]) format(dev) mount(dev, "/data/#{cmd_opts[:name]}") end def grow(cmd_opts) raise "No logical volume name specified" unless cmd_opts[:name] raise "No logical volume size specified" unless cmd_opts[:size] raise "No volume group name specified" unless cmd_opts[:volume] dev = lv_dev(cmd_opts[:volume], cmd_opts[:name]) lv_extend(dev, cmd_opts[:size]) growfs(dev) end def remove(cmd_opts) raise "No logical volume name specified" unless cmd_opts[:name] raise "No volume group name specified" unless cmd_opts[:volume] dev = lv_dev(cmd_opts[:volume], cmd_opts[:name]) umount(dev) lv_remove(dev) end protected def create_mirrors(size, num_mirrors = 2, num_disks = 2) md_devs = [] num_mirrors.times do volumes = [] num_disks.times do volumes << create_volume(size) end devices = [] volumes.each do |v_id| mp = next_avail_disk mount_volume v_id, mp devices << mp end wait_for devices md_dev = next_md create_md_mirror md_dev, *devices pv_create md_dev md_devs << md_dev end md_devs end end end