diff --git a/gluster/swift/common/middleware/gswauth/bin/swauth-list b/gluster/swift/common/middleware/gswauth/bin/swauth-list index c49af04..7ad0974 100755 --- a/gluster/swift/common/middleware/gswauth/bin/swauth-list +++ b/gluster/swift/common/middleware/gswauth/bin/swauth-list @@ -26,6 +26,7 @@ from sys import argv, exit from swift.common.bufferedhttp import http_connect_raw as http_connect from swift.common.utils import urlparse +from prettytable import PrettyTable if __name__ == '__main__': gettext.install('swauth', unicode=1) @@ -34,11 +35,11 @@ Usage: %prog [options] [account] [user] If [account] and [user] are omitted, a list of accounts will be output. -If [account] is included but not [user], an account's information will be -output, including a list of users within the account. +If [account] is included but not [user], a list of users within the account +will be output. -If [account] and [user] are included, the user's information will be output, -including a list of groups the user belongs to. +If [account] and [user] are included, a list of groups the user belongs to +will be ouptput. If the [user] is '.groups', the active groups for the account will be listed. '''.strip()) @@ -46,6 +47,10 @@ If the [user] is '.groups', the active groups for the account will be listed. action='store_true', default=False, help='Changes the output from ' 'JSON to plain text. This will cause an account to list only the ' 'users and a user to list only the groups.') + parser.add_option('-j', '--json', dest='json_format', + action='store_true', default=False, help='Output in JSON format. ' + 'This will print all information about given account or user, ' + 'including stored password.') parser.add_option('-A', '--admin-url', dest='admin_url', default='http://127.0.0.1:8080/auth/', help='The URL to the auth ' 'subsystem (default: http://127.0.0.1:8080/auth/') @@ -82,5 +87,12 @@ If the [user] is '.groups', the active groups for the account will be listed. info = json.loads(body) for group in info[['accounts', 'users', 'groups'][len(args)]]: print group['name'] - else: + elif options.json_format: print body + else: + info = json.loads(body) + h = ['accounts', 'users', 'groups'][len(args)] + table = PrettyTable([h.title()]) + for group in info[h]: + table.add_row([group['name']]) + print table diff --git a/glusterfs-openstack-swift.spec b/glusterfs-openstack-swift.spec index 951c22a..357f682 100644 --- a/glusterfs-openstack-swift.spec +++ b/glusterfs-openstack-swift.spec @@ -23,6 +23,7 @@ BuildRequires: python-setuptools Requires : memcached Requires : openssl Requires : python +Requires : python-prettytable Requires : openstack-swift = 1.10.0 Requires : openstack-swift-account = 1.10.0 Requires : openstack-swift-container = 1.10.0 diff --git a/test/functional_auth/gswauth/test_gswauth_cli.py b/test/functional_auth/gswauth/test_gswauth_cli.py index 2e6db11..f6c08df 100644 --- a/test/functional_auth/gswauth/test_gswauth_cli.py +++ b/test/functional_auth/gswauth/test_gswauth_cli.py @@ -33,6 +33,10 @@ class Utils: def deleteAccount(self,account_name,authurl='http://127.0.0.1:8080/auth/',user=config['admin_user'],key=config['admin_key']): return commands.getstatusoutput('swauth-delete-account %s -A %s -U %s -K %s' % (account_name,authurl, user, key)) + @classmethod + def listAccounts(self,authurl='http://127.0.0.1:8080/auth/',user=config['admin_user'],key=config['admin_key']): + return commands.getstatusoutput('swauth-list -A %s -U %s -K %s' % (authurl, user, key)) + @classmethod def swauthPrep(self,authurl='http://127.0.0.1:8080/auth/',user=config['admin_user'],key=config['admin_key']): return commands.getstatusoutput('swauth-prep -A %s -U %s -K %s' % (authurl, user, key)) @@ -56,8 +60,8 @@ class Utils: @classmethod def cleanAll(self): #TODO:It's a dirty hack,any suggestions? - commands.getstatusoutput('rm -rf '+os.path.join(config['devices'], config['gsmetadata_volume'], '*')) - commands.getstatusoutput('rm -rf '+os.path.join(config['devices'], config['gsmetadata_volume'], '.*')) + commands.getstatusoutput('sudo rm -rf '+os.path.join(config['devices'], config['gsmetadata_volume'], '*')) + return commands.getstatusoutput('sudo rm -rf '+os.path.join(config['devices'], config['gsmetadata_volume'], '.*')) class TestSwauthPrep(unittest.TestCase): @@ -158,6 +162,15 @@ class TestAccount(unittest.TestCase): self.assertNotEqual(status, 0, 'account deletion failed for accountdoesnotexist'+output) #TODO:more cases + def testListAcounts(self): + (status,output)=Utils.addAccount('test') + self.assertEqual(status, 0, 'account creation failed'+output) + + (status,output)=Utils.listAccounts() + self.assertEqual(output, + '+----------+\n| Accounts |\n+----------+\n| test |\n+----------+', + 'swauth-list failed:\n%s' % output) + class TestUser(unittest.TestCase): diff --git a/tools/test-requires b/tools/test-requires index 874e96f..6bf711e 100644 --- a/tools/test-requires +++ b/tools/test-requires @@ -11,3 +11,4 @@ nosehtmloutput sphinx>=1.1.2 mock>=0.8.0 python-keystoneclient +prettytable