After starting out with Python RAD zonemgr module I thought it is time to write about another available Python RAD module. In the following I want to give you a short and simple look and feel of how to get ZFS property information (name, type, atime, compression, compressratio, dedup, mounted and mountpoint). The puprpose is to get people interested in Solaris going with RAD and show how easily it can be used.
Let’s start with the usual imports which are pretty self-explaining. One is needed to open a connection and the other one depends on the purpose of the script. In this case we want to get ZFS properties which means we will use zfsmgr.
In case it is not already installed just run: pkg install rad-zfsmgr
import rad.connect as radc import rad.bindings.com.oracle.solaris.rad.zfsmgr_1 as zfsmgr
Next we need to connect to a RAD client. In this case it is a local one and a unix socket can be used.
If you like to use a remote connection go ahead and use ssh://[hostname] instead.
uri = radc.RadURI("unix:///") rc = uri.connect()
We now have an open connection (rc) and we can move on to the ZFS part.
First we need is to know what the existing datasets are. rc.list_object(zfsmgr.ZfsDataset()) will do exactly this for us. It lists all the ZFS dataset objects (ZfsDataset) the RAD zfs manager (zfsmgr) has to offer for the chosen connection (rc).
zfsDataSets = rc.list_objects(zfsmgr.ZfsDataset())
Well, the list of datasets is complete. But we will need more than just the objects of each dataset.
In order to get the information we are interested in we need to define it first. Therefore ZfsPropRequest is used.
prop0 = zfsmgr.ZfsPropRequest(name="name") prop1 = zfsmgr.ZfsPropRequest(name="type") prop2 = zfsmgr.ZfsPropRequest(name="atime") prop3 = zfsmgr.ZfsPropRequest(name="compression") prop4 = zfsmgr.ZfsPropRequest(name="compressratio") prop5 = zfsmgr.ZfsPropRequest(name="dedup") prop6 = zfsmgr.ZfsPropRequest(name="mounted") prop7 = zfsmgr.ZfsPropRequest(name="mountpoint")
After defining the properties we just loop through each of the object list of the ZFS datasets and request the value for the just defined keys of the current object (zobj).
for dataset in zfsDataSets: zobj = rc.get_object(dataset) zvalues = zobj.get_props([prop0, prop1, prop2, prop3, prop4, prop5, prop6, prop7]) print "%-40s%-14s%-8s%-13s%-15s%-7s%-9s%s" % (zvalues.value, zvalues.value, zvalues.value, zvalues.value, zvalues.value, zvalues.value, zvalues.value, zvalues.value)
Done. Got the information and therefore can close the connection at this point.
The output will remind you of a regular zfs list -o … output. One may say why should I use RAD then and the answer is quiet simple. Because this is just a trivial example of how you can make use RAD of the zfsmgr to get dataset information. The next steps would be to use the above and automate whatever comes to your mind. Juggle around with the objects, keys, values, etc.. Add more functions to it and even combine it with more RAD modules (e.g.: rad-zonemgr). That’s where you will benefit the most. But even small automation tasks are perfect for this.
Last but not least, here is an example of what it might look like. I had to take out a few lines because it included Solaris beta content.
Remember, the purpose was to make the very first step with RAD together with ZFS. Try it out and you will most probably like it and stick to it.