diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 33aef0a122..b1b11007fb 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -21,8 +21,7 @@ Server action implementations import logging -from cliff.command import Command - +from openstackclient.common import command from openstackclient.common import utils @@ -57,9 +56,10 @@ def _print_server(cs, server): utils.print_dict(info) -class List_Server(Command): +class List_Server(command.OpenStackCommand): "List server command." + api = 'compute' log = logging.getLogger(__name__) def get_parser(self, prog_name): @@ -74,9 +74,10 @@ class List_Server(Command): def run(self, parsed_args): self.log.info('v2.List_Server.run(%s)' % parsed_args) -class Show_Server(Command): +class Show_Server(command.OpenStackCommand): "Show server command." + api = 'compute' log = logging.getLogger(__name__) def get_parser(self, prog_name): diff --git a/openstackclient/shell.py b/openstackclient/shell.py index a95f452819..f01b76c931 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -27,6 +27,9 @@ import sys from cliff.app import App from cliff.commandmanager import CommandManager +from keystoneclient.v2_0 import client as ksclient + +from openstackclient.common import exceptions as exc from openstackclient.common import utils @@ -58,6 +61,22 @@ class OpenStackShell(App): command_manager=CommandManager('openstack.cli'), ) + def _authenticate(self, **kwargs): + """Get an auth token from Keystone + + :param username: name of user + :param password: user's password + :param tenant_id: unique identifier of tenant + :param tenant_name: name of tenant + :param auth_url: endpoint to authenticate against + """ + _ksclient = ksclient.Client(username=kwargs.get('username'), + password=kwargs.get('password'), + tenant_id=kwargs.get('tenant_id'), + tenant_name=kwargs.get('tenant_name'), + auth_url=kwargs.get('auth_url')) + return _ksclient.auth_token + def build_option_parser(self, description, version): parser = super(OpenStackShell, self).build_option_parser( description, @@ -97,20 +116,20 @@ class OpenStackShell(App): parser.add_argument('--os-compute-api-version', metavar='<compute-api-version>', default=env('OS_COMPUTE_API_VERSION', default='2'), - help='Compute API version, default=2.0 (Env: OS_COMPUTE_API_VERSION)') + help='Compute API version, default=2 (Env: OS_COMPUTE_API_VERSION)') parser.add_argument('--os-image-api-version', metavar='<image-api-version>', default=env('OS_IMAGE_API_VERSION', default='1.0'), help='Image API version, default=1.0 (Env: OS_IMAGE_API_VERSION)') - parser.add_argument('--service-token', metavar='<service-token>', - default=env('SERVICE_TOKEN'), - help=argparse.SUPPRESS) + parser.add_argument('--os-token', metavar='<token>', + default=env('OS_TOKEN'), + help='Defaults to env[OS_TOKEN]') - parser.add_argument('--service-endpoint', metavar='<service-endpoint>', - default=env('SERVICE_ENDPOINT'), - help=argparse.SUPPRESS) + parser.add_argument('--os-url', metavar='<url>', + default=env('OS_URL'), + help='Defaults to env[OS_URL]') return parser @@ -130,6 +149,39 @@ class OpenStackShell(App): print "API: Identity=%s Compute=%s Image=%s" % (self.api_version['identity'], self.api_version['compute'], self.api_version['image']) print "cmd: %s" % cmd + # do checking of os_username, etc here + if (self.options.os_token and self.options.os_url): + # do token auth + endpoint = self.options.os_url + token = self.options.os_token + else: + if not self.options.os_username: + raise exc.CommandError("You must provide a username via" + " either --os-username or env[OS_USERNAME]") + + if not self.options.os_password: + raise exc.CommandError("You must provide a password via" + " either --os-password or env[OS_PASSWORD]") + + if not (self.options.os_tenant_id or self.options.os_tenant_name): + raise exc.CommandError("You must provide a tenant_id via" + " either --os-tenant-id or via env[OS_TENANT_ID]") + + if not self.options.os_auth_url: + raise exc.CommandError("You must provide an auth url via" + " either --os-auth-url or via env[OS_AUTH_URL]") + kwargs = { + 'username': self.options.os_username, + 'password': self.options.os_password, + 'tenant_id': self.options.os_tenant_id, + 'tenant_name': self.options.os_tenant_name, + 'auth_url': self.options.os_auth_url + } + token = self._authenticate(**kwargs) + # get service catalog via cmd.api + # get client instance here + print "api: %s" % cmd.api + def clean_up(self, cmd, result, err): self.log.debug('clean_up %s', cmd.__class__.__name__) if err: