Merge "Enable endpoint filter parameters for the CLI"

This commit is contained in:
Jenkins
2015-07-08 14:15:48 +00:00
committed by Gerrit Code Review
3 changed files with 144 additions and 3 deletions

View File

@@ -121,6 +121,7 @@ class Barbican(app.App):
def create_client(self, args):
created_client = None
endpoint_filter_kwargs = self._get_endpoint_filter_kwargs(args)
api_version = args.os_identity_api_version
if args.no_auth and args.os_auth_url:
@@ -138,7 +139,8 @@ class Barbican(app.App):
created_client = client.Client(
endpoint=args.endpoint,
project_id=args.os_tenant_id or args.os_project_id,
verify=not args.insecure
verify=not args.insecure,
**endpoint_filter_kwargs
)
# Token-based authentication
elif args.os_auth_token:
@@ -153,7 +155,8 @@ class Barbican(app.App):
)
created_client = client.Client(
session=session,
endpoint=args.endpoint
endpoint=args.endpoint,
**endpoint_filter_kwargs
)
# Password-based authentication
@@ -169,13 +172,23 @@ class Barbican(app.App):
)
created_client = client.Client(
session=session,
endpoint=args.endpoint
endpoint=args.endpoint,
**endpoint_filter_kwargs
)
else:
raise Exception('ERROR: please specify authentication credentials')
return created_client
def _get_endpoint_filter_kwargs(self, args):
endpoint_filter_keys = ('interface', 'service_type', 'service_name',
'barbican_api_version', 'region_name')
kwargs = dict((key, getattr(args, key)) for key in endpoint_filter_keys
if getattr(args, key, None))
if 'barbican_api_version' in kwargs:
kwargs['version'] = kwargs.pop('barbican_api_version')
return kwargs
def build_option_parser(self, description, version, argparse_kwargs=None):
"""Introduces global arguments for the application.
This is inherited from the framework.
@@ -252,6 +265,26 @@ class Barbican(app.App):
metavar='<barbican-url>',
default=client.env('BARBICAN_ENDPOINT'),
help='Defaults to env[BARBICAN_ENDPOINT].')
parser.add_argument('--interface',
metavar='<barbican-interface>',
default=client.env('BARBICAN_INTERFACE'),
help='Defaults to env[BARBICAN_INTERFACE].')
parser.add_argument('--service-type',
metavar='<barbican-service-type>',
default=client.env('BARBICAN_SERVICE_TYPE'),
help='Defaults to env[BARBICAN_SERVICE_TYPE].')
parser.add_argument('--service-name',
metavar='<barbican-service-name>',
default=client.env('BARBICAN_SERVICE_NAME'),
help='Defaults to env[BARBICAN_SERVICE_NAME].')
parser.add_argument('--region-name',
metavar='<barbican-region-name>',
default=client.env('BARBICAN_REGION_NAME'),
help='Defaults to env[BARBICAN_REGION_NAME].')
parser.add_argument('--barbican-api-version',
metavar='<barbican-api-version>',
default=client.env('BARBICAN_API_VERSION'),
help='Defaults to env[BARBICAN_API_VERSION].')
session.Session.register_cli_options(parser)
return parser

View File

@@ -14,6 +14,7 @@
# limitations under the License.
import six
from barbicanclient import client
from barbicanclient import barbican as barb
from barbicanclient.tests import keystone_client_fixtures
from barbicanclient.tests import test_client
@@ -156,6 +157,39 @@ class WhenTestingBarbicanCLI(test_client.BaseEntityResource):
response = barb.main(args)
self.assertEqual(1, response)
def test_default_endpoint_filter_kwargs_set_correctly(self):
auth_args = ('--no-auth --endpoint http://barbican_endpoint:9311/v1 '
'--os-project-id project1')
argv, remainder = self.parser.parse_known_args(auth_args.split())
barbican_client = self.barbican.create_client(argv)
httpclient = barbican_client.secrets._api
self.assertEqual(client._DEFAULT_SERVICE_INTERFACE,
httpclient.interface)
self.assertEqual(client._DEFAULT_SERVICE_TYPE, httpclient.service_type)
self.assertEqual(client._DEFAULT_API_VERSION, httpclient.version)
self.assertEqual(None, httpclient.service_name)
def test_endpoint_filter_kwargs_set_correctly(self):
from testtools.content import text_content
auth_args = ('--no-auth --endpoint http://barbican_endpoint:9311/v1 '
'--os-project-id project1')
endpoint_filter_args = ('--interface private '
'--service-type custom-type '
'--service-name Burrbican '
'--region-name RegionTwo '
'--barbican-api-version v2')
args = auth_args + ' ' + endpoint_filter_args
argv, remainder = self.parser.parse_known_args(args.split())
barbican_client = self.barbican.create_client(argv)
httpclient = barbican_client.secrets._api
self.assertEqual('private', httpclient.interface)
self.assertEqual('custom-type', httpclient.service_type)
self.assertEqual('Burrbican', httpclient.service_name)
self.assertEqual('RegionTwo', httpclient.region_name)
self.assertEqual('v2', httpclient.version)
class TestBarbicanWithKeystonePasswordAuth(
keystone_client_fixtures.KeystoneClientFixture):

View File

@@ -20,6 +20,7 @@ from barbicanclient import client
from barbicanclient import exceptions
from keystoneclient.auth import identity
from keystoneclient import session
import keystoneclient.openstack.common.apiclient.exceptions as ks_exceptions
CONF = config.get_config()
@@ -70,6 +71,14 @@ class WhenTestingClientConnectivity(BaseTestCase):
self.assertRaises(exceptions.HTTPClientError, client.orders.list)
self.assertRaises(exceptions.HTTPClientError, client.secrets.list)
def assert_client_cannot_get_endpoint(self, client):
self.assertRaises(ks_exceptions.EndpointNotFound,
client.containers.list)
self.assertRaises(ks_exceptions.EndpointNotFound,
client.orders.list)
self.assertRaises(ks_exceptions.EndpointNotFound,
client.secrets.list)
def test_can_access_server_if_endpoint_and_session_specified(self):
barbicanclient = client.Client(
endpoint=CONF.keymanager.url,
@@ -93,6 +102,71 @@ class WhenTestingClientConnectivity(BaseTestCase):
self.assert_client_can_contact_barbican(barbicanclient)
def test_client_can_access_server_if_endpoint_filters_specified(self):
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface=client._DEFAULT_SERVICE_INTERFACE,
service_type=client._DEFAULT_SERVICE_TYPE,
version=client._DEFAULT_API_VERSION,
)
self.assert_client_can_contact_barbican(barbicanclient)
def test_client_cannot_access_server_if_endpoint_filter_wrong(self):
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface=client._DEFAULT_SERVICE_INTERFACE,
service_type='wrong-service-type',
version=client._DEFAULT_API_VERSION,
)
self.assert_client_cannot_get_endpoint(barbicanclient)
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface='wrong-interface',
service_type=client._DEFAULT_SERVICE_TYPE,
version=client._DEFAULT_API_VERSION,
)
self.assert_client_cannot_get_endpoint(barbicanclient)
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface=client._DEFAULT_SERVICE_INTERFACE,
service_type=client._DEFAULT_SERVICE_TYPE,
service_name='wrong-service-name',
version=client._DEFAULT_API_VERSION,
)
self.assert_client_cannot_get_endpoint(barbicanclient)
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface=client._DEFAULT_SERVICE_INTERFACE,
service_type=client._DEFAULT_SERVICE_TYPE,
region_name='wrong-region-name',
version=client._DEFAULT_API_VERSION,
)
self.assert_client_cannot_get_endpoint(barbicanclient)
def test_client_cannot_access_server_if_nonexistent_version_specified(self):
barbicanclient = client.Client(
project_id=CONF.keymanager.project_id,
auth=self.auth,
interface=client._DEFAULT_SERVICE_INTERFACE,
service_type=client._DEFAULT_SERVICE_TYPE,
version='wrong-version',
)
self.assertRaises(TypeError, barbicanclient.containers.list)
def test_client_cannot_access_server_if_nonexistent_version_specified(self):
barbicanclient = client.Client(
endpoint=CONF.keymanager.url,