From: Anil Belur Date: Mon, 15 May 2017 01:29:45 +0000 (+1000) Subject: Add openstack server list and cleanup commands X-Git-Tag: v0.2.0~3 X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?a=commitdiff_plain;h=fb32a2cec9fffe08dee164f4087b8318e932c516;p=releng%2Flftools.git Add openstack server list and cleanup commands This adds 2 new commands to lftools to manipulate openstack servers: list: Prints available servers in the cloud. cleanup: Removes old servers from the cloud. Change-Id: Ic9a99f8a5d13e040868f2271c1814ab82d9e0ac8 Signed-off-by: Anil Belur --- diff --git a/lftools/openstack/cmd.py b/lftools/openstack/cmd.py index c693da03..1ba7d29d 100644 --- a/lftools/openstack/cmd.py +++ b/lftools/openstack/cmd.py @@ -15,6 +15,7 @@ __author__ = 'Thanh Ha' import click from lftools.openstack import image as os_image +from lftools.openstack import server as os_server @click.group() @@ -71,3 +72,38 @@ def list(ctx, days, hide_public): image.add_command(cleanup) image.add_command(list) + + +@openstack.group() +@click.pass_context +def server(ctx): + """Command for manipulating servers.""" + pass + + +@click.command() +@click.option( + '--days', type=int, default=0, + help='Find servers older than or equal to days.') +@click.pass_context +def cleanup(ctx, days): + """Cleanup old servers.""" + os_server.cleanup( + ctx.obj['os_cloud'], + days=days) + + +@click.command() +@click.option( + '--days', type=int, default=0, + help='Find servers older than or equal to days.') +@click.pass_context +def list(ctx, days): + """List cloud servers.""" + os_server.list( + ctx.obj['os_cloud'], + days=days) + + +server.add_command(cleanup) +server.add_command(list) diff --git a/lftools/openstack/server.py b/lftools/openstack/server.py new file mode 100644 index 00000000..4c3210cc --- /dev/null +++ b/lftools/openstack/server.py @@ -0,0 +1,72 @@ +# -*- code: utf-8 -*- +# @License EPL-1.0 +############################################################################## +# Copyright (c) 2017 The Linux Foundation and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################## +"""Server related sub-commands for openstack command.""" + +__author__ = 'Anil Belur' + +from datetime import datetime +from datetime import timedelta + +import shade + + +def _filter_servers(servers, days=0): + """Filter server data and return list.""" + filtered = [] + for server in servers: + if days and ( + datetime.strptime(server.created, '%Y-%m-%dT%H:%M:%SZ') + >= datetime.now() - timedelta(days=days)): + continue + + filtered.append(server) + return filtered + + +def list(os_cloud, days=0): + """List servers found according to parameters.""" + cloud = shade.openstack_cloud(cloud=os_cloud) + servers = cloud.list_servers() + + filtered_servers = _filter_servers(servers, days) + for server in filtered_servers: + print(server.name) + + +def cleanup(os_cloud, days=0): + """Remove server from cloud. + + :arg str os_cloud: Cloud name as defined in OpenStack clouds.yaml. + :arg int days: Filter servers that are older than number of days. + """ + def _remove_servers_from_cloud(servers, cloud): + print('Removing {} servers from {}.'.format(len(servers), cloud.cloud_config.name)) + for server in servers: + try: + result = cloud.delete_server(server.name) + except shade.exc.OpenStackCloudException as e: + if str(e).startswith('Multiple matches found for'): + print('WARNING: {}. Skipping server...'.format(str(e))) + continue + else: + print('ERROR: Unexpected exception: {}'.format(str(e))) + raise + + if not result: + print('WARNING: Failed to remove \"{}\" from {}. Possibly already deleted.' + .format(server.name, cloud.cloud_config.name)) + else: + print('Removed "{}" from {}.'.format(server.name, cloud.cloud_config.name)) + + cloud = shade.openstack_cloud(cloud=os_cloud) + servers = cloud.list_servers() + filtered_servers = _filter_servers(servers, days) + _remove_servers_from_cloud(filtered_servers, cloud)