Skip to content

Instantly share code, notes, and snippets.

@jeffrey4l
Created November 29, 2018 09:22
Show Gist options
  • Save jeffrey4l/99a30098044fa63620ae37e50dc3b8b0 to your computer and use it in GitHub Desktop.
Save jeffrey4l/99a30098044fa63620ae37e50dc3b8b0 to your computer and use it in GitHub Desktop.

Revisions

  1. jeffrey4l created this gist Nov 29, 2018.
    148 changes: 148 additions & 0 deletions openstack_statistics.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,148 @@
    #!/usr/bin/env python
    import shade
    import collections
    import prettytable

    cloud = shade.openstack_cloud()

    projects = cloud.list_projects()

    project_mapping = {}
    for project in projects:
    project_mapping[project.id] = project.name

    users = cloud.list_users()
    user_mapping = {}
    for user in users:
    user_mapping[user.id] = user.name

    flavors = cloud.list_flavors()
    flavor_mapping = {}
    for flavor in flavors:
    flavor_mapping[flavor.id] = flavor


    def bytes_2_human_readable(number_of_bytes):
    if number_of_bytes < 0:
    raise ValueError("!!! number_of_bytes can't be smaller than 0 !!!")

    step_to_greater_unit = 1024.

    number_of_bytes = float(number_of_bytes)
    unit = 'bytes'

    if (number_of_bytes / step_to_greater_unit) >= 1:
    number_of_bytes /= step_to_greater_unit
    unit = 'KB'

    if (number_of_bytes / step_to_greater_unit) >= 1:
    number_of_bytes /= step_to_greater_unit
    unit = 'MB'

    if (number_of_bytes / step_to_greater_unit) >= 1:
    number_of_bytes /= step_to_greater_unit
    unit = 'GB'

    if (number_of_bytes / step_to_greater_unit) >= 1:
    number_of_bytes /= step_to_greater_unit
    unit = 'TB'

    precision = 1
    number_of_bytes = round(number_of_bytes, precision)

    return str(number_of_bytes) + ' ' + unit

    def get_flavor(id, prop):

    flavor = flavor_mapping.get(id, {})
    if not flavor:
    return 0
    return getattr(flavor, prop)


    def nova_static():

    servers = cloud.list_servers(all_projects=True)
    #servers = cloud.list_servers()

    statics = collections.defaultdict(list)
    for server in servers:
    project_name = project_mapping[server.project_id]
    statics[project_name].append(server)

    table = prettytable.PrettyTable(['Project', 'Active VM', 'None-Active VM', 'Total', 'total cpu', 'total size', 'total ram'])

    for project_name, servers in statics.items():

    row = [project_name,
    len([server for server in servers if server.status == 'ACTIVE']),
    len([server for server in servers if server.status != 'ACTIVE']),
    len(servers),
    sum([get_flavor(server.flavor.id, 'vcpus') for server in servers]),
    sum([get_flavor(server.flavor.id, 'disk') for server in servers]),
    bytes_2_human_readable(sum([get_flavor(server.flavor.id, 'ram') for server in servers]) * 1024 * 1024),
    ]
    table.add_row(row)

    print(table.get_string(sortby='Active VM',
    reversesort=True))

    def volume_static():
    search_opts = { 'all_tenants': True }
    cinderclient = cloud.cinder_client
    volumes = cinderclient.volumes.list(search_opts=search_opts)
    statics = collections.defaultdict(list)
    for volume in volumes:
    user_name = user_mapping[volume.user_id]
    statics[user_name].append(volume)
    table = prettytable.PrettyTable(['User',
    'Total Vol',
    'Attached Vol',
    'Avail Vol',
    'Totol Size',
    'Total Used Size',
    'Total Free Size'
    ])
    for user_name, volumes in statics.items():
    row = [user_name,
    len(volumes),
    len([volume for volume in volumes if volume.status == 'in-use']),
    len([volume for volume in volumes if volume.status != 'in-use']),
    sum([volume.size for volume in volumes]),
    sum([volume.size for volume in volumes if volume.status == 'in-use']),
    sum([volume.size for volume in volumes if volume.status != 'in-use']),
    ]
    table.add_row(row)
    print(table.get_string(sortby='Total Free Size', reversesort=True))

    def image_static():
    images = cloud.list_images()
    statics = collections.defaultdict(list)
    for image in images:
    project_name = project_mapping.get(image.location.project.id, 'None')
    statics[project_name].append(image)

    table = prettytable.PrettyTable(['Project',
    'total image',
    'total size',
    'total size in byte',
    'names'
    ])
    for project_name, images in statics.items():
    image_names = ','.join([image.name for image in images])
    row = [project_name,
    len(images),
    bytes_2_human_readable(sum([image.size for image in images])),
    sum([image.size for image in images]),
    image_names[:80]
    ]
    table.add_row(row)
    print(table.get_string(sortby='total size in byte',
    fields=['Project', 'total image', 'total size', 'names'],
    reversesort=True))


    if __name__ == "__main__":
    nova_static()
    volume_static()
    image_static()