def users(): stats = dict() stats['total'] = 0 for name in sorted(regions['regions'].iterkeys()): logger.debug('=> count region %s' % name) novaclient = Nova(options.config, debug=options.debug, log=logger, region=name) instances = novaclient.get_instances() stats['total'] += len(instances) for i in instances: user = ksclient.get_by_id('user', i.user_id) if not user: org = 'unknown' logger.debug('=> unknown user for %s (id=%s)' % (i.name, i.id)) elif '@' not in user.name: org = 'sysuser' else: org = user.name.split("@")[1] if org in stats: stats[org] += 1 else: stats[org] = 1 if options.output == 'count': stats['header'] = 'Usage grouped by user email domain:' printer.output_dict(stats) else: percent = dict() if stats['total'] > 0: for s in sorted(stats): percent[s] = (float(stats[s]) / float(stats['total'])) * 100 percent[ 'header'] = 'Percentage of instances grouped by users email domain:' printer.output_dict(percent)
def action_disabled(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() printer.output_dict({'header': '%s: Instances in disabled project (host, name, project)' % region}) groups = {'group1': 0, 'group2': 0, 'group3': 0} count = 0 for i in instances: project = ksclient.get_by_id('project', i.tenant_id) if project.enabled: continue host = getattr(i, 'OS-EXT-SRV-ATTR:host').split('.')[0] output = {'name': i.name, 'project': project.name, 'status': host} printer.output_dict(output, sort=True, one_line=True) if '01' in host or '04' in host: groups['group1'] += 1 elif '02' in host or '05' in host: groups['group2'] += 1 elif '03' in host or '06' in host: groups['group3'] += 1 count += 1 output = {'header': 'Instance count', 'total': count} output.update(groups) printer.output_dict(output)
def action_nodiscard(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) glclient = Glance(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() printer.output_dict({'header': '%s: Instances without discard (image, name, visibility)' % region}) count = 0 for i in instances: image = glclient.get_image_by_id(i.image['id']) # Remove instances in disabled project project = ksclient.get_by_id('project', i.tenant_id) if project.enabled: continue # Assume that hw_disk_bus == discard if image and 'hw_disk_bus' in image: continue if not image: image = dict() image['name'] = 'unknown' image['visibility'] = 'unknown' output = {'name': i.name, 'image': image['name'], 'status': image['visibility']} printer.output_dict(output, sort=True, one_line=True) count += 1 printer.output_dict({'header': 'Instance count', 'count': count})
def org(): stats = dict() stats['total'] = 0 for name in sorted(regions['regions'].iterkeys()): logger.debug('=> count region %s' % name) novaclient = Nova(options.config, debug=options.debug, log=logger, region=name) instances = novaclient.get_instances() stats['total'] += len(instances) for i in instances: user = ksclient.get_by_id('user', i.user_id) if not user: org = 'unknown' logger.debug('=> unknown user for %s (id=%s)' % (i.name, i.id)) elif '@' not in user.name: org = 'sysuser' else: domain = user.name.split("@")[1] if len(domain.split(".")) > 1: org = domain.split(".")[-2] else: org = 'unknown' if org in stats: stats[org] += 1 else: stats[org] = 1 if options.output == 'count': stats['header'] = 'Usage grouped by user organization:' printer.output_dict(stats) else: percent = dict() if stats['total'] > 0: for s in sorted(stats): percent[s] = (float(stats[s])/float(stats['total']))*100 percent['header'] = 'Percentage of instances grouped by users organization:' printer.output_dict(percent)
def action_disabled(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() printer.output_dict({ 'header': '%s: Instances in disabled project (host, name, project)' % region }) groups = {'group1': 0, 'group2': 0, 'group3': 0} count = 0 for i in instances: project = ksclient.get_by_id('project', i.tenant_id) if project.enabled: continue host = getattr(i, 'OS-EXT-SRV-ATTR:host').split('.')[0] output = {'name': i.name, 'project': project.name, 'status': host} printer.output_dict(output, sort=True, one_line=True) if '01' in host or '04' in host: groups['group1'] += 1 elif '02' in host or '05' in host: groups['group2'] += 1 elif '03' in host or '06' in host: groups['group3'] += 1 count += 1 output = {'header': 'Instance count', 'total': count} output.update(groups) printer.output_dict(output)
def project(): stats = { 'demo': 0, 'personal': 0, 'research': 0, 'education': 0, 'admin': 0, 'test': 0, 'hpc': 0, 'total': 0 } for name in sorted(regions['regions'].iterkeys()): logger.debug('=> count region %s' % name) novaclient = Nova(options.config, debug=options.debug, log=logger, region=name) instances = novaclient.get_instances() stats['total'] += len(instances) for i in instances: project = ksclient.get_by_id('project', i.tenant_id) if not project: sys.stderr.write("MISSING PROJECT! id=%s for instance %s\n" % (i.tenant_id, i.name)) continue if hasattr(project, 'course'): stats['education'] += 1 elif '@' in project.name: stats['personal'] += 1 else: if hasattr(project, 'type'): if project.type not in stats: print "unknown project type %s for %s" % (project.type, project.name) else: stats[project.type] += 1 else: stats['admin'] += 1 if options.output == 'count': stats['header'] = 'Number of instances grouped by instance type:' printer.output_dict(stats) else: percent = dict() if stats['total'] > 0: for s in sorted(stats): percent[s] = (float(stats[s]) / float(stats['total'])) * 100 percent['header'] = 'Percent of instances grouped by instance type:' printer.output_dict(percent)
def action_instance(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() mapping = dict(region=region.upper()) body_content = himutils.load_template(inputfile=options.template, mapping=mapping, log=logger) subject = options.subject notify = Notify(options.config, debug=False, log=logger) notify.set_keystone_client(ksclient) notify.set_dry_run(options.dry_run) users = notify.mail_instance_owner(instances=instances, body=body_content, subject=subject, admin=True, options=['project', 'az']) notify.close() printer.output_dict(users)
def project(): stats = {'demo': 0, 'personal': 0, 'research': 0, 'education': 0, 'admin': 0, 'test': 0, 'total': 0} for name in sorted(regions['regions'].iterkeys()): logger.debug('=> count region %s' % name) novaclient = Nova(options.config, debug=options.debug, log=logger, region=name) instances = novaclient.get_instances() stats['total'] += len(instances) for i in instances: project = ksclient.get_by_id('project', i.tenant_id) if not project: sys.stderr.write("MISSING PROJECT! id=%s for instance %s\n" % (i.tenant_id, i.name)) continue if hasattr(project, 'course'): stats['education'] += 1 elif '@' in project.name: stats['personal'] += 1 else: if hasattr(project, 'type'): if project.type not in stats: print "unknown project type %s for %s" % (project.type, project.name) else: stats[project.type] += 1 else: stats['admin'] += 1 if options.output == 'count': stats['header'] = 'Number of instances grouped by instance type:' printer.output_dict(stats) else: percent = dict() if stats['total'] > 0: for s in sorted(stats): percent[s] = (float(stats[s])/float(stats['total']))*100 percent['header'] = 'Percent of instances grouped by instance type:' printer.output_dict(percent)
def action_instance(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() mapping = dict(region=region.upper()) body_content = himutils.load_template(inputfile=options.template, mapping=mapping, log=logger) subject = options.subject notify = Notify(options.config, debug=False, log=logger) notify.set_keystone_client(ksclient) notify.set_dry_run(options.dry_run) users = notify.mail_instance_owner(instances=instances, body=body_content, subject=subject, admin=True, options=['project', 'az']) notify.close() printer.output_dict(users)
def action_nodiscard(): for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) glclient = Glance(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() printer.output_dict({ 'header': '%s: Instances without discard (image, name, visibility)' % region }) count = 0 for i in instances: image = glclient.get_image_by_id(i.image['id']) # Remove instances in disabled project project = ksclient.get_by_id('project', i.tenant_id) if project.enabled: continue # Assume that hw_disk_bus == discard if image and 'hw_disk_bus' in image: continue if not image: image = dict() image['name'] = 'unknown' image['visibility'] = 'unknown' output = { 'name': i.name, 'image': image['name'], 'status': image['visibility'] } printer.output_dict(output, sort=True, one_line=True) count += 1 printer.output_dict({'header': 'Instance count', 'count': count})
def action_instance(): #ToDo for region in regions: flavors = dict() cores = ram = 0 novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() total = 0 for i in instances: # Filter demo project = ksclient.get_by_id('project', i.tenant_id) if not options.demo and project and 'DEMO' in project.name: continue flavor_name = i.flavor.get('original_name', 'unknown') flavors[flavor_name] = flavors.get(flavor_name, 0) + 1 cores += i.flavor.get('vcpus', 0) ram += i.flavor.get('ram', 0) total += 1 printer.output_dict({'header': '%s instances' % region}) printer.output_dict(flavors) printer.output_dict({'header': '%s resources' % region}) printer.output_dict({'cores': cores, 'ram': '%.1f MB' % int(ram), 'instances': total})
def action_instance(): #ToDo for region in regions: flavors = dict() cores = ram = 0 novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) instances = novaclient.get_instances() total = 0 for i in instances: # Filter demo project = ksclient.get_by_id('project', i.tenant_id) if not options.demo and project and 'DEMO' in project.name: continue flavor_name = i.flavor.get('original_name', 'unknown') flavors[flavor_name] = flavors.get(flavor_name, 0) + 1 cores += i.flavor.get('vcpus', 0) ram += i.flavor.get('ram', 0) total += 1 printer.output_dict({'header': '%s instances' % region}) printer.output_dict(flavors) printer.output_dict({'header': '%s resources' % region}) printer.output_dict({'cores': cores, 'ram': '%.1f MB' % int(ram), 'instances': total})