summaryrefslogtreecommitdiff
path: root/openstackclient/compute
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/compute')
-rw-r--r--openstackclient/compute/client.py1
-rw-r--r--openstackclient/compute/v2/security_group.py2
-rw-r--r--openstackclient/compute/v2/server.py14
-rw-r--r--openstackclient/compute/v2/usage.py83
4 files changed, 90 insertions, 10 deletions
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 3725350a..166747d5 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -50,6 +50,7 @@ def make_client(instance):
extensions=extensions,
http_log_debug=http_log_debug,
timings=instance.timing,
+ region_name=instance._region_name,
)
return client
diff --git a/openstackclient/compute/v2/security_group.py b/openstackclient/compute/v2/security_group.py
index cd330857..f7ffb1d1 100644
--- a/openstackclient/compute/v2/security_group.py
+++ b/openstackclient/compute/v2/security_group.py
@@ -23,7 +23,7 @@ from cliff import command
from cliff import lister
from cliff import show
-from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
+from keystoneclient import exceptions as ksc_exc
from novaclient.v1_1 import security_group_rules
from openstackclient.common import parseractions
from openstackclient.common import utils
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 5ab1d5f3..a5d8b0c3 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -511,25 +511,27 @@ class CreateServerImage(show.ShowOne):
class DeleteServer(command.Command):
- """Delete server command"""
+ """Delete server(s)"""
log = logging.getLogger(__name__ + '.DeleteServer')
def get_parser(self, prog_name):
parser = super(DeleteServer, self).get_parser(prog_name)
parser.add_argument(
- 'server',
+ 'servers',
metavar='<server>',
- help=_('Server (name or ID)'),
+ nargs="+",
+ help=_('Server(s) to delete (name or ID)'),
)
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
compute_client = self.app.client_manager.compute
- server = utils.find_resource(
- compute_client.servers, parsed_args.server)
- compute_client.servers.delete(server.id)
+ for server in parsed_args.servers:
+ server_obj = utils.find_resource(
+ compute_client.servers, server)
+ compute_client.servers.delete(server_obj.id)
return
diff --git a/openstackclient/compute/v2/usage.py b/openstackclient/compute/v2/usage.py
index ed98af26..c71ecb18 100644
--- a/openstackclient/compute/v2/usage.py
+++ b/openstackclient/compute/v2/usage.py
@@ -20,6 +20,8 @@ import logging
import sys
from cliff import lister
+from cliff import show
+import six
from openstackclient.common import utils
@@ -60,12 +62,14 @@ class ListUsage(lister.Lister):
compute_client = self.app.client_manager.compute
columns = (
"tenant_id",
+ "server_usages",
"total_memory_mb_usage",
"total_vcpus_usage",
"total_local_gb_usage"
)
column_headers = (
"Project",
+ "Servers",
"RAM MB-Hours",
"CPU Hours",
"Disk GB-Hours"
@@ -84,7 +88,7 @@ class ListUsage(lister.Lister):
else:
end = now + datetime.timedelta(days=1)
- usage_list = compute_client.usage.list(start, end)
+ usage_list = compute_client.usage.list(start, end, detailed=True)
# Cache the project list
project_cache = {}
@@ -95,8 +99,8 @@ class ListUsage(lister.Lister):
# Just forget it if there's any trouble
pass
- if len(usage_list) > 0:
- sys.stdout.write("Usage from %s to %s:" % (
+ if parsed_args.formatter == 'table' and len(usage_list) > 0:
+ sys.stdout.write("Usage from %s to %s: \n" % (
start.strftime(dateformat),
end.strftime(dateformat),
))
@@ -106,8 +110,81 @@ class ListUsage(lister.Lister):
s, columns,
formatters={
'tenant_id': _format_project,
+ 'server_usages': lambda x: len(x),
'total_memory_mb_usage': lambda x: float("%.2f" % x),
'total_vcpus_usage': lambda x: float("%.2f" % x),
'total_local_gb_usage': lambda x: float("%.2f" % x),
},
) for s in usage_list))
+
+
+class ShowUsage(show.ShowOne):
+ """Show resource usage for a single project. """
+
+ log = logging.getLogger(__name__ + ".ShowUsage")
+
+ def get_parser(self, prog_name):
+ parser = super(ShowUsage, self).get_parser(prog_name)
+ parser.add_argument(
+ "--start",
+ metavar="<start>",
+ default=None,
+ help="Usage range start date, ex 2012-01-20"
+ " (default: 4 weeks ago)."
+ )
+ parser.add_argument(
+ "--end",
+ metavar="<end>",
+ default=None,
+ help="Usage range end date, ex 2012-01-20 (default: tomorrow)."
+ )
+ parser.add_argument(
+ "--project",
+ metavar="<project>",
+ default=None,
+ help="Name or ID of project to show usage for."
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug("take_action(%s)", parsed_args)
+
+ identity_client = self.app.client_manager.identity
+ compute_client = self.app.client_manager.compute
+ dateformat = "%Y-%m-%d"
+ now = datetime.datetime.utcnow()
+
+ if parsed_args.start:
+ start = datetime.datetime.strptime(parsed_args.start, dateformat)
+ else:
+ start = now - datetime.timedelta(weeks=4)
+
+ if parsed_args.end:
+ end = datetime.datetime.strptime(parsed_args.end, dateformat)
+ else:
+ end = now + datetime.timedelta(days=1)
+
+ if parsed_args.project:
+ project = utils.find_resource(
+ identity_client.projects,
+ parsed_args.project,
+ ).id
+ else:
+ # Get the project from the current auth
+ project = self.app.client_manager.auth_ref.project_id
+
+ usage = compute_client.usage.get(project, start, end)
+
+ if parsed_args.formatter == 'table':
+ sys.stdout.write("Usage from %s to %s on project %s: \n" % (
+ start.strftime(dateformat),
+ end.strftime(dateformat),
+ project
+ ))
+
+ info = {}
+ info['Servers'] = len(usage.server_usages)
+ info['RAM MB-Hours'] = float("%.2f" % usage.total_memory_mb_usage)
+ info['CPU Hours'] = float("%.2f" % usage.total_vcpus_usage)
+ info['Disk GB-Hours'] = float("%.2f" % usage.total_local_gb_usage)
+ return zip(*sorted(six.iteritems(info)))