NetApp API using call quota list

Can not have more than 1000 quota list calls using NetApp API?


[2016-12-30 18:19:40] [INFO] [] checkQuotaAndCreateQtree Start
[2016-12-30 18:19:40] [INFO] [] getNetAppQuotaList Start
[2016-12-30 18:19:40] [INFO] [] getQuotaList Start
[2016-12-30 18:19:45] [INFO] []  - arrNetAppQuotaList size : 1000
[2016-12-30 18:19:45] [INFO] []  - quotaList Size : 1000
[2016-12-30 18:19:45] [INFO] []  - isQuota :
[2016-12-30 18:19:45] [INFO] [] addQuota Start
[2016-12-30 18:19:50] [ERROR] [] addQuota NaAPIFailedException



Re: NetApp API using call quota list

I'm not terribly familiar with the Java side of things, but do you know which ZAPI it's using?  If it's using "quota-list-entries" then I think it does have some's a single API call that will return all results, up to the maximum, at once.  Using the iteration set of APIs should have no maximum however.  You'll need to use quota-list-entries-iter-start followed by quota-list-entries-iter-next until it returns that there are no futher entries and, to be polite, end with quota-list-entries-iter-end.


Hope that helps.



If this post resolved your issue, please help others by selecting ACCEPT AS SOLUTION or adding a KUDO.

Re: NetApp API using call quota list

[ Edited ]



Yes you can get more then a thousand quotas returned by API but not in a single API call. You should use the next-tag to keep calling for the next until there are none.


I am not a Java guy so I'll give you a sample of my Python code where I get a lot of quotas from quota report. In one filer it returns more than 60k quotas, so it works.


def _get_quota_report_cluster(filer):
quota_report = []

# simulate a do while
tag = None
while True:
if tag:
api = filer.call_api('quota-report-iter', ('max-records', '200'), ('tag', tag))
api = filer.call_api('quota-report-iter', ('max-records', '200'))
# check if filer connection have any error
if api == "error":
return []
tag = api.child_get_string('next-tag')

attribute_list = api.child_get('attributes-list')

if attribute_list and attribute_list.has_children():
for q in attribute_list.children_get():
quota = Quota()
quota.filer_name = q.child_get_string('vserver')
quota.volume = q.child_get_string('volume')
quota.tree = q.child_get_string('tree') = q.child_get_string('quota-target')
quota.type = q.child_get_string('quota-type')

if quota.type == 'user' or quota.type == 'sid':
if q.child_get('quota-users') is None:
for user in q.child_get('quota-users').children_get():
quota.user = user.child_get_string('quota-user-name')
quota.disk_used_gb = q.child_get_int('disk-used')
quota.disk_limit_gb = q.child_get_int('disk-limit')
except ValueError:
quota.disk_used_gb = 0
quota.disk_limit_gb = 0
if not tag:
return quota_report


Pay attention that Filer and Quota are classes that I created, so it's not in the NMSDK. The main point here is the concept.


In this example the function returns a list of quotas object.