jceel / py-libzfs

Python libzfs bindings
16 stars 8 forks source link

Can't make ZFSPool.create work #12

Closed mexicarne closed 8 years ago

mexicarne commented 8 years ago

Hi,

so ZFSPool.create() is defined like this:

def create(self, name, fsopts, fstype=DatasetType.FILESYSTEM, sparse_vol=False)

Now I'm trying to create like this:

import libzfs

def zfs_create_dataset(dataset_name):
    """ Create new dataset """
    result = None
    zfs = libzfs.ZFS()
    ds = libzfs.DatasetType.FILESYSTEM
    try:
        zfs.create(dataset_name, {}, ds, 0)
        result = True
    except libzfs.ZFSException as e:
        return False, e
    return result, ''

if __name__ == '__main__':
    res, err = zfs_create_dataset('zroot/neminomi')
    print(err)

And it fails with:

Traceback (most recent call last):
  File "1.py", line 16, in <module>
    res, err = zfs_create_dataset('zroot/neminomi')
  File "1.py", line 9, in zfs_create_dataset
    zfs.create(dataset_name, {}, ds, 0)
  File "libzfs.pyx", line 411, in libzfs.ZFS.create (libzfs.c:13168)
  File "nvpair.pxi", line 51, in libzfs.NVList.__init__ (libzfs.c:2996)
AttributeError: 'DatasetType' object has no attribute 'items'

If I remove 3rd and 4th argument of create() - they have defaults - then I'm getting this:

Traceback (most recent call last):
  File "1.py", line 16, in <module>
    res, err = zfs_create_dataset('zroot/neminomi')
  File "1.py", line 9, in zfs_create_dataset
    zfs.create(dataset_name, {})#, ds, 0)
  File "libzfs.pyx", line 409, in libzfs.ZFS.create (libzfs.c:13110)
TypeError: create() takes exactly 4 positional arguments (2 given)

Would you provide me with a working sample of zfs create please?

jceel commented 8 years ago

You are calling create() on libzfs.ZFS instead of libzfs.ZFSPool, so it's trying to create a pool instead of dataset. You need to first grab a reference to pool object using pool = zfs.get('zroot').

mexicarne commented 8 years ago

Bugger. Sorry for noise.