Add openstack server list and cleanup commands 61/4861/4
authorAnil Belur <abelur@linuxfoundation.org>
Mon, 15 May 2017 01:29:45 +0000 (11:29 +1000)
committerAnil Belur <abelur@linuxfoundation.org>
Fri, 19 May 2017 05:13:31 +0000 (15:13 +1000)
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 <abelur@linuxfoundation.org>
lftools/openstack/cmd.py
lftools/openstack/server.py [new file with mode: 0644]

index c693da0..1ba7d29 100644 (file)
@@ -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 (file)
index 0000000..4c3210c
--- /dev/null
@@ -0,0 +1,72 @@
+# -*- code: utf-8 -*-
+# @License EPL-1.0 <http://spdx.org/licenses/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)