[Ovirt-devel] [PATCH]: Add NFS file creation/deletion to taskomatic

Scott Seago sseago at redhat.com
Tue Nov 25 22:52:42 UTC 2008


Chris Lalancette wrote:
> All,
>      Attached is a patch to implement NFS file creation/deletion in the
> taskomatic back-end.  Actually, this patch does quite a bit more than that:
>
> 1)  Implement NFS file creation/deletion
> 2)  Fix LVM creation - due to the way I was testing, there was a glaring bug in
> the implementation that caused it not to work at all on new, raw LUNs
> 3)  Make sure to flip the Pool and Volume states to "available", once things are
> available.
>
> With this patch in place, along with a minor patch to libvirt (updated packages
> coming soon), I was able to successfully create and delete LVM volumes, NFS
> files, and then use those newly created LUNs/files in a guest.
>
> Caveat: note that NFS file creation can take a *long* time.  Basically, we fully
> allocate the file at creation time, which means we have to write the entire disk
> full of zeros.  During this time, both libvirtd (on the remote node) and
> taskomatic can't accept any more tasks.  This will eventually be fixed by a)
> making libvirtd multithreaded, and b) making taskomatic fully threaded.
>
> Finally: with this in place, a couple of problems come to light.  One is that we
> probably want to give users the ability to choose a sparse file vs. a non-sparse
> file (but that's a minor change in the frontend and in taskomatic).  The second
> is much more complicated and important; namely, that we need users to be able to
> assign /dev/sda to iSCSI LUN 3, /dev/sdb to NFS file 2, etc.  At the *very*
> least we need users to be able to specify which device is the root device.  In
> any case, this is future work.
>
> Signed-off-by: Chris Lalancette <clalance at redhat.com>
>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> Ovirt-devel mailing list
> Ovirt-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/ovirt-devel
> diff --git a/src/app/controllers/storage_controller.rb 
> b/src/app/controllers/storage_controller.rb
> index 6d171c9..2235b6a 100644
> --- a/src/app/controllers/storage_controller.rb
> +++ b/src/app/controllers/storage_controller.rb
> @@ -143,12 +143,19 @@ class StorageController < ApplicationController
>        unless lvm_pool
>          # FIXME: what should we do about VG/LV names?
>          # for now auto-create VG name as ovirt_vg_#{@source_volume.id}
> -        lvm_pool = LvmStoragePool.new(:vg_name => 
> "ovirt_vg_#{@source_volume.id}",
> -              :hardware_pool_id => 
> @source_volume.storage_pool.hardware_pool_id)
> +        new_params = { :vg_name => "ovirt_vg_#{@source_volume.id}",
> +          :hardware_pool_id => 
> @source_volume.storage_pool.hardware_pool_id}
> +        lvm_pool = StoragePool.factory(StoragePool::LVM, new_params)
>          lvm_pool.source_volumes << @source_volume
>          lvm_pool.save!
>        end
>        new_volume_internal(lvm_pool, { :storage_pool_id => lvm_pool.id})
> +
> +      # now that we've created the new pool and volume, make sure to 
> link that
> +      # new LVM pool to the source volume
> +      @source_volume.lvm_pool_id = lvm_pool.id
> +      @source_volume.save!
> +
>        @storage_volume.lv_owner_perms='0744'
>        @storage_volume.lv_group_perms='0744'
>        @storage_volume.lv_mode_perms='0744'
You shouldn't have to set the lvm_pool_id for the source volume, as 
you've already set that relationship from the other side. When the 
lvm_pool was saved, the source_volume <-> lvm_pool association was saved 
into the database. Did you run into any particular problems without the 
latter code? From what I see here, we're essentially setting (and 
saving) that association twice.
> diff --git a/src/app/models/lvm_storage_volume.rb 
> b/src/app/models/lvm_storage_volume.rb
> index 4aac265..8eb1f0e 100644
> --- a/src/app/models/lvm_storage_volume.rb
> +++ b/src/app/models/lvm_storage_volume.rb
> @@ -25,4 +25,8 @@ class LvmStorageVolume < StorageVolume
>    def volume_name
>      "lv_name"
>    end
> +
> +  def volume_create_params
> +    return lv_name, size, lv_owner_perms, lv_group_perms, lv_mode_perms
> +  end
>  end
> diff --git a/src/app/models/nfs_storage_volume.rb 
> b/src/app/models/nfs_storage_volume.rb
> index 2c18d67..61d5795 100644
> --- a/src/app/models/nfs_storage_volume.rb
> +++ b/src/app/models/nfs_storage_volume.rb
> @@ -25,4 +25,8 @@ class NfsStorageVolume < StorageVolume
>    def volume_name
>      "filename"
>    end
> +
> +  def volume_create_params
> +    return filename, size, "0744", "0744", "0744"
> +  end
>  end
Do we want to be able to set the permissions for all volume types? It 
seems a bit inconsistent to hard-code them for NFS but ask for them in 
the LVM form.

I haven't been able to test it yet -- my appliance build failed, and I 
don't have time to diagnose/fix that right now, but I'll see what I can 
do about that tomorrow morning. But we do need to get this in before we 
build -- so if this works with a fresh appliance build for you we should 
probably be able to push it.

Scott





More information about the ovirt-devel mailing list