ZFS Storage Appliance RESTful API
Until now I have used ssh and javascript to do some of the more advanced automation tasks like snapshots, cloning and replication. I am starting to look at porting to REST and here is a quick example of two functions.
** I needed fabric and python-requests linux packages installed for python.
#!/usr/bin/env fab from fabric.api import task,hosts,settings,env from fabric.utils import abort import requests, json, os from datetime import date #requests.packages.urllib3.disable_warnings() today = date.today() # ZFSSA API URL url = "https://192.168.2.200:215" # ZFSSA authentication credentials, it reads username and password from environment variables ZFSUSER and ZFSPASSWORD zfsauth = (os.getenv('ZFSUSER'), os.getenv('ZFSPASSWORD')) jsonheader={'Content-Type': 'application/json'} # This gets the pool list def list_pools(): r = requests.get("%s/api/storage/v1/pools" % (url), auth=zfsauth, verify=False, headers=jsonheader) if r.status_code != 200: abort("Error getting pools %s %s" % (r.status_code, r.text)) j = json.loads(r.text) #print j for pool in j["pools"]: #print pool #{u'status': u'online', u'profile': u'stripe', u'name': u'tank1', u'owner': u'zfsapp1', u'usage': {}, u'href': u'/api/storage/v1/pools/tank1', u'peer': u'00000000-0000-0000-0000-000000000000', u'asn': u'91bdcaef-fea5-e796-8793-f2eefa46200a'}ation print "pool: %s and status: %s" % (pool["name"], pool["status"]) # Create project def create_project(pool, projname): # First check if the target project name already exists r = requests.get("%s/api/storage/v1/pools/%s/projects/%s" % (url, pool, projname), auth=zfsauth, verify=False, headers=jsonheader) if r.status_code != 404: abort("ZFS project %s already exists (or other error): %s" % (projname, r.status_code)) payload = { 'name': projname, 'sharenfs': 'ro' } r = requests.post("%s/api/storage/v1/pools/%s/projects" % (url, pool), auth=zfsauth, verify=False, data=json.dumps(payload), headers=jsonheader) if r.status_code == 201: print "project created" else: abort("Error creating project %s %s" % (r.status_code, r.text)) print "\n\nTest list pools and create a project\n" list_pools() create_project('tank1','proj-01')
References:
http://www.oracle.com/technetwork/articles/servers-storage-admin/zfs-appliance-scripting-1508184.html
http://docs.oracle.com/cd/E51475_01/html/E52433/
http://ilmarkerm.blogspot.com/2014/12/sample-code-using-oracle-zfs-storage.html