def altai_stats(): cs = auth.admin_client_set() tenants = cs.identity_admin.tenants.list() users = cs.identity_admin.users.list() # TODO(imelnikov): should we ignore servers in systenant? servers = cs.compute.servers.list(search_opts={'all_tenants': 1}) images = list_all_images(cs.image.images) global_images = [image for image in images if image.is_public] return make_json_response({ 'projects': len(tenants) - 1, # not counting systenant 'instances': len(servers), 'users': len(users), 'total-images': len(images), 'global-images': len(global_images), 'by-project-stats-href': url_for('stats.list_stats_by_project') })
def list_stats_by_project(): parse_collection_request(_SCHEMA) cs = auth.admin_client_set() if g.my_projects: tenants = g.client_set.identity_public.tenants.list() else: tenants = cs.identity_admin.tenants.list() result = {} for tenant in tenants: if tenant.id != auth.default_tenant_id(): users = cs.identity_admin.tenants.list_users(tenant.id) result[tenant.id] = { 'project': link_for_tenant(tenant), 'members': len(users), 'instances': 0, 'local-images': 0, 'total-images': 0, 'href': url_for('stats.get_project_stats', project_id=tenant.id) } for server in cs.compute.servers.list(search_opts={'all_tenants': 1}): try: result[server.tenant_id]['instances'] += 1 except KeyError: pass global_images = 0 for image in list_all_images(cs.image.images): if image.is_public: global_images += 1 if image.owner in result: result[image.owner]['local-images'] += 1 if not image.is_public: result[image.owner]['total-images'] += 1 for value in result.itervalues(): value['total-images'] += global_images data = sorted(result.itervalues(), key=lambda s: s['href']) return make_collection_response(u'stats', data, parent_href=url_for('stats.altai_stats'))