Remove RefStack dependency on Keystone client.

RefStack should use Tempest approach for retrieving Keystone service
Id. For RefStack purpose, raw API call to keystone should be enough
to get necessary information.

Closes-Bug: #1528357

Change-Id: I555308aabb59b638e22249ead882ca5b09043b7b
This commit is contained in:
david liu 2016-01-11 17:58:00 +08:00 committed by David Liu
parent 5e5233c199
commit 0fc224a533
3 changed files with 273 additions and 342 deletions

View File

@ -38,8 +38,6 @@ import time
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from keystoneclient.v2_0 import client as ksclient2
from keystoneclient.v3 import client as ksclient3
import requests
import requests.exceptions
import six.moves
@ -140,8 +138,9 @@ class RefstackClient:
return os.path.join(tempest_dir, '.testrepository', subunit_file)
def _get_cpid_from_keystone(self, conf_file):
'''This will get the Keystone service ID which is used as the CPID.'''
def _get_keystone_config(self, conf_file):
'''This will get and return the keystone configs
from config file.'''
try:
# Prefer Keystone V3 API if it is enabled
auth_version = (
@ -151,7 +150,15 @@ class RefstackClient:
'api_v3')
and conf_file.has_option('identity', 'uri_v3'))
else 'v2')
if auth_version == 'v2':
auth_url = '%s/tokens' % (conf_file.get('identity', 'uri')
.rstrip('/'))
elif auth_version == 'v3':
auth_url = '%s/auth/tokens' % (conf_file.get('identity',
'uri_v3').rstrip('/'))
domain_name = 'Default'
if conf_file.has_option('identity', 'domain_name'):
domain_name = conf_file.get('identity', 'domain_name')
if conf_file.has_option('auth', 'test_accounts_file'):
account_file = os.path.expanduser(
conf_file.get('auth', 'test_accounts_file'))
@ -165,12 +172,17 @@ class RefstackClient:
self.logger.error('Accounts file %s found, '
'but was empty.' % account_file)
exit(1)
account = accounts[0]
username = account.get('username')
password = account.get('password')
tenant_id = account.get('tenant_id')
tenant_name = account.get('tenant_name')
return {'auth_version': auth_version,
'auth_url': auth_url,
'domain_name': domain_name,
'username': username, 'password': password,
'tenant_id': tenant_id, 'tenant_name': tenant_name
}
else:
username = conf_file.get('identity', 'username')
password = conf_file.get('identity', 'password')
@ -179,69 +191,107 @@ class RefstackClient:
tenant_id = conf_file.get('identity', 'tenant_id')
else:
tenant_id = None
tenant_name = conf_file.get('identity', 'tenant_name')
args = {
'insecure': self.args.insecure,
'username': username,
'password': password
}
if tenant_id:
args['tenant_id'] = tenant_id
else:
args['tenant_name'] = tenant_name
try:
if auth_version == 'v2':
args['auth_url'] = conf_file.get('identity', 'uri')
client = ksclient2.Client(**args)
token = client.auth_ref
for service in token['serviceCatalog']:
if service['type'] == 'identity':
if service['endpoints'][0]['id']:
return service['endpoints'][0]['id']
# Raise a key error if 'identity' was not found so that it
# can be caught and have an appropriate error displayed.
raise KeyError
elif auth_version == 'v3':
args['auth_url'] = conf_file.get('identity', 'uri_v3')
if conf_file.has_option('identity', 'domain_name'):
args['project_domain_name'] = \
conf_file.get('identity', 'domain_name')
args['user_domain_name'] = conf_file.get('identity',
'domain_name')
if conf_file.has_option('identity', 'region'):
args['region_name'] = conf_file.get('identity',
'region')
client = ksclient3.Client(**args)
token = client.auth_ref
for service in token['catalog']:
if service['type'] == 'identity' and service['id']:
return service['id']
# Raise a key error if 'identity' was not found. It will
# be caught below as well.
raise KeyError
else:
raise ValueError('Auth_version %s is unsupported'
'' % auth_version)
# If a Key or Index Error was raised, one of the expected keys or
# indices for retrieving the identity service ID was not found.
except (KeyError, IndexError) as e:
self.logger.warning('Unable to retrieve CPID from Keystone %s '
'catalog. The catalog or the identity '
'service endpoint was not '
'found.' % auth_version)
except Exception as e:
self.logger.warning('Problems retrieving CPID from Keystone '
'using %s endpoint (%s)' % (auth_version,
args['auth_url']))
return self._generate_cpid_from_endpoint(args['auth_url'])
tenant_name = conf_file.get('identity', 'tenant_name')
return {'auth_version': auth_version,
'auth_url': auth_url,
'domain_name': domain_name,
'username': username, 'password': password,
'tenant_id': tenant_id, 'tenant_name': tenant_name}
except ConfigParser.Error as e:
# Most likely a missing section or option in the config file.
self.logger.error("Invalid Config File: %s" % e)
exit(1)
def _generate_keystone_data(self, auth_config):
'''This will generate data for http post to keystone
API from auth_config.'''
auth_version = auth_config['auth_version']
auth_url = auth_config['auth_url']
if auth_version == 'v2':
password_credential = {'username': auth_config['username'],
'password': auth_config['password']}
if auth_config['tenant_id']:
data = {
'auth': {
'tenantId': auth_config['tenant_id'],
'passwordCredentials': password_credential
}
}
else:
data = {
'auth': {
'tenantName': auth_config['tenant_name'],
'passwordCredentials': password_credential
}
}
return auth_version, auth_url, data
elif auth_version == 'v3':
identity = {'methods': ['password'], 'password':
{'user': {'name': auth_config['username'],
'domain': {
'name': auth_config['domain_name']
},
'password': auth_config['password']}}}
data = {
'auth': {
'identity': identity,
'scope': {
'project': {
'name': auth_config['username'],
'domain': {'name': auth_config['domain_name']}
}
}
}
}
return auth_version, auth_url, data
def _get_cpid_from_keystone(self, auth_version, auth_url, content):
'''This will get the Keystone service ID which is used as the CPID.'''
try:
headers = {'content-type': 'application/json'}
response = requests.post(auth_url,
data=json.dumps(content),
headers=headers,
verify=not self.args.insecure)
rsp = response.json()
if response.status_code in (200, 203):
# keystone API v2 response.
access = rsp['access']
for service in access['serviceCatalog']:
if service['type'] == 'identity':
if service['endpoints'][0]['id']:
return service['endpoints'][0]['id']
# Raise a key error if 'identity' was not found so that it
# can be caught and have an appropriate error displayed.
raise KeyError
elif response.status_code == 201:
# keystone API v3 response.
token = rsp['token']
for service in token['catalog']:
if service['type'] == 'identity' and service['id']:
return service['id']
# Raise a key error if 'identity' was not found.
# It will be caught below as well.
raise KeyError
else:
message = ('Invalid request with error '
'code: %s. Error message: %s'
'' % (rsp['error']['code'],
rsp['error']['message']))
raise requests.exceptions.HTTPError(message)
# If a Key or Index Error was raised, one of the expected keys or
# indices for retrieving the identity service ID was not found.
except (KeyError, IndexError) as e:
self.logger.warning('Unable to retrieve CPID from Keystone %s '
'catalog. The catalog or the identity '
'service endpoint was not '
'found.' % auth_version)
except Exception as e:
self.logger.warning('Problems retrieving CPID from Keystone '
'using %s endpoint (%s) with error (%s)'
% (auth_version, auth_url, e))
return self._generate_cpid_from_endpoint(auth_url)
def _generate_cpid_from_endpoint(self, endpoint):
'''This method will md5 hash the hostname of a Keystone endpoint to
generate a CPID.'''
@ -333,7 +383,10 @@ class RefstackClient:
self._prep_test()
results_file = self._get_next_stream_subunit_output_file(
self.tempest_dir)
cpid = self._get_cpid_from_keystone(self.conf)
keystone_config = self._get_keystone_config(self.conf)
auth_version, auth_url, content = \
self._generate_keystone_data(keystone_config)
cpid = self._get_cpid_from_keystone(auth_version, auth_url, content)
self.logger.info("Starting Tempest test...")
start_time = time.time()

View File

@ -24,6 +24,7 @@ import httmock
import mock
from mock import MagicMock
import unittest
import requests
import refstack_client.refstack_client as rc
@ -68,7 +69,7 @@ class TestRefstackClient(unittest.TestCase):
argv.extend(('--', kwargs.get('test_cases', None)))
return argv
def mock_keystone(self):
def mock_data(self):
"""
Mock the Keystone client methods.
"""
@ -76,24 +77,13 @@ class TestRefstackClient(unittest.TestCase):
'endpoints': [{'id': 'test-id'}]}
self.mock_identity_service_v3 = {'type': 'identity',
'id': 'test-id'}
self.mock_ks2_client = MagicMock(
name='ks_client',
**{'auth_ref':
{'serviceCatalog': [self.mock_identity_service_v2]}}
)
self.mock_ks3_client = MagicMock(
name='ks_client',
**{'auth_ref':
{'catalog': [self.mock_identity_service_v3]}}
)
self.ks2_client_builder = self.patch(
'refstack_client.refstack_client.ksclient2.Client',
return_value=self.mock_ks2_client
)
self.ks3_client_builder = self.patch(
'refstack_client.refstack_client.ksclient3.Client',
return_value=self.mock_ks3_client
)
self.v2_config = {'auth_url': 'http://0.0.0.0:35357/v2.0/tokens',
'auth_version': 'v2',
'domain_name': 'Default',
'password': 'test',
'tenant_id': 'admin_tenant_id',
'tenant_name': 'tenant_name',
'username': 'admin'}
def setUp(self):
"""
@ -163,99 +153,6 @@ class TestRefstackClient(unittest.TestCase):
expected_file = "/tempest/path/.testrepository/0"
self.assertEqual(expected_file, output_file)
def test_get_cpid_from_keystone_with_tenant_id(self):
"""
Test getting the CPID from Keystone using an admin tenant ID.
"""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
self.mock_keystone()
cpid = client._get_cpid_from_keystone(client.conf)
self.ks2_client_builder.assert_called_with(
username='admin', tenant_id='admin_tenant_id',
password='test', auth_url='http://0.0.0.0:35357/v2.0',
insecure=False
)
self.assertEqual('test-id', cpid)
def test_get_cpid_from_keystone_with_tenant_name(self):
"""
Test getting the CPID from Keystone using an admin tenant name.
"""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.remove_option('identity', 'tenant_id')
client.conf.set('identity', 'tenant_name', 'tenant_name')
self.mock_keystone()
cpid = client._get_cpid_from_keystone(client.conf)
self.ks2_client_builder.assert_called_with(
username='admin', tenant_name='tenant_name',
password='test', auth_url='http://0.0.0.0:35357/v2.0',
insecure=False
)
self.assertEqual('test-id', cpid)
def test_get_cpid_from_keystone_by_tenant_name_from_account_file(self):
"""
Test getting a CPID from Keystone using an admin tenant name
from an accounts file.
"""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.add_section('auth')
client.conf.set('auth',
'test_accounts_file',
'%s/test-accounts.yaml' % self.test_path)
self.mock_keystone()
cpid = client._get_cpid_from_keystone(client.conf)
self.ks2_client_builder.assert_called_with(
username='admin', tenant_name='tenant_name',
password='test', auth_url='http://0.0.0.0:35357/v2.0',
insecure=False
)
self.assertEqual('test-id', cpid)
def test_get_cpid_from_keystone_by_tenant_id_from_account_file(self):
"""
Test getting a CPID from Keystone using an admin tenant ID
from an accounts file.
"""
accounts = [
{
'username': 'admin',
'tenant_id': 'tenant_id',
'password': 'test'
}
]
self.patch(
'refstack_client.refstack_client.read_accounts_yaml',
return_value=accounts)
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.add_section('auth')
client.conf.set('auth',
'test_accounts_file',
'%s/test-accounts.yaml' % self.test_path)
self.mock_keystone()
cpid = client._get_cpid_from_keystone(client.conf)
self.ks2_client_builder.assert_called_with(
username='admin', tenant_id='tenant_id',
password='test', auth_url='http://0.0.0.0:35357/v2.0',
insecure=False
)
self.assertEqual('test-id', cpid)
def test_get_cpid_account_file_not_found(self):
"""
Test that the client will exit if an accounts file is specified,
@ -271,11 +168,11 @@ class TestRefstackClient(unittest.TestCase):
'test_accounts_file',
'%s/some-file.yaml' % self.test_path)
self.mock_keystone()
self.mock_data()
with self.assertRaises(SystemExit):
client._get_cpid_from_keystone(client.conf)
client._get_keystone_config(client.conf)
def test_get_cpid_account_file_empty(self):
def test_get_keystone_config_account_file_empty(self):
"""
Test that the client will exit if an accounts file exists,
but is empty.
@ -294,119 +191,72 @@ class TestRefstackClient(unittest.TestCase):
'test_accounts_file',
'%s/some-file.yaml' % self.test_path)
self.mock_keystone()
self.mock_data()
with self.assertRaises(SystemExit):
client._get_cpid_from_keystone(client.conf)
client._get_keystone_config(client.conf)
def test_get_cpid_from_keystone_insecure(self):
def test_get_keystone_config(self):
"""
Test getting the CPID from Keystone with the insecure arg passed in.
"""
argv = self.mock_argv()
argv.append('--insecure')
args = rc.parse_cli_args(argv)
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
self.mock_keystone()
client._get_cpid_from_keystone(client.conf)
self.ks2_client_builder.assert_called_with(
username='admin', tenant_id='admin_tenant_id',
password='test', auth_url='http://0.0.0.0:35357/v2.0',
insecure=True
)
def test_get_cpid_from_keystone_v3(self):
"""
Test getting the CPID from Keystone API v3.
Test that keystone configs properly parsed.
"""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.remove_option('identity', 'tenant_id')
client.conf.set('identity', 'tenant_name', 'tenant_name')
client.conf.set('identity-feature-enabled', 'api_v3', 'true')
self.mock_keystone()
cpid = client._get_cpid_from_keystone(client.conf)
self.ks3_client_builder.assert_called_with(
username='admin', tenant_name='tenant_name',
password='test', auth_url='http://0.0.0.0:35357/v3',
insecure=False
)
self.assertEqual('test-id', cpid)
self.mock_data()
actual_result = client._get_keystone_config(client.conf)
expected_result = self.v2_config
self.assertEqual(expected_result, actual_result)
def test_get_cpid_from_keystone_v2_varying_catalogs(self):
def test_get_cpid_from_keystone_by_tenant_name_from_account_file(self):
"""
Test getting the CPID from keystone API v2 varying catalogs.
Test getting a CPID from Keystone using an admin tenant name
from an accounts file.
"""
argv = self.mock_argv()
args = rc.parse_cli_args(argv)
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.add_section('auth')
client.conf.set('auth',
'test_accounts_file',
'%s/test-accounts.yaml' % self.test_path)
self.mock_data()
actual_result = client._get_keystone_config(client.conf)
expected_result = None
self.assertEqual(expected_result, actual_result['tenant_id'])
accounts = [
{
'username': 'admin',
'tenant_id': 'tenant_id',
'password': 'test'
}
]
self.patch(
'refstack_client.refstack_client.read_accounts_yaml',
return_value=accounts)
actual_result = client._get_keystone_config(client.conf)
self.assertEqual('tenant_id', actual_result['tenant_id'])
client._generate_cpid_from_endpoint = MagicMock()
# Test when the identity endpoints is empty
self.mock_ks2_client = MagicMock(
name='ks_client',
**{'auth_ref':
{'serviceCatalog': [{'type': 'identity', 'endpoints': []}]}}
)
self.ks2_client_builder = self.patch(
'refstack_client.refstack_client.ksclient2.Client',
return_value=self.mock_ks2_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v2.0'
)
# Test when the catalog is empty
self.mock_ks2_client = MagicMock(
name='ks_client',
**{'auth_ref': {'serviceCatalog': []}}
)
self.ks2_client_builder = self.patch(
'refstack_client.refstack_client.ksclient2.Client',
return_value=self.mock_ks2_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v2.0'
)
# Test when there is no service catalog
self.mock_ks2_client = MagicMock(name='ks_client', **{'auth_ref': {}})
self.ks2_client_builder = self.patch(
'refstack_client.refstack_client.ksclient2.Client',
return_value=self.mock_ks2_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v2.0'
)
# Test when catalog has other non-identity services.
self.mock_ks2_client = MagicMock(
name='ks_client',
**{'auth_ref':
{'serviceCatalog': [{'type': 'compute',
'endpoints': [{'id': 'test-id1'}]},
{'type': 'identity',
'endpoints': [{'id': 'test-id2'}]}]}
}
)
self.ks2_client_builder = self.patch(
'refstack_client.refstack_client.ksclient2.Client',
return_value=self.mock_ks2_client
)
cpid = client._get_cpid_from_keystone(client.conf)
self.assertEqual('test-id2', cpid)
def test_generate_keystone_data(self):
"""Test that correct data is generated."""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.set('identity', 'tenant_name', 'tenant_name')
self.mock_data()
configs = client._get_keystone_config(client.conf)
actual_results = client._generate_keystone_data(configs)
expected_results = ('v2', 'http://0.0.0.0:35357/v2.0/tokens',
{'auth':
{'passwordCredentials':
{
'username': 'admin', 'password': 'test'
},
'tenantId': 'admin_tenant_id'}})
self.assertEqual(expected_results, actual_results)
def test_get_cpid_from_keystone_v3_varying_catalogs(self):
"""
@ -419,65 +269,79 @@ class TestRefstackClient(unittest.TestCase):
client.conf.remove_option('identity', 'tenant_id')
client.conf.set('identity', 'tenant_name', 'tenant_name')
client.conf.set('identity-feature-enabled', 'api_v3', 'true')
self.mock_data()
configs = client._get_keystone_config(client.conf)
auth_version, auth_url, content = \
client._generate_keystone_data(configs)
client._generate_cpid_from_endpoint = MagicMock()
requests.post = MagicMock()
# Test when the identity ID is None.
ks3_ID_None = {'auth_ref': {'catalog':
[{'type': 'identity', 'id': None}]}}
# Test when the identity ID is None.
self.mock_ks3_client = MagicMock(
name='ks_client',
**{'auth_ref': {'catalog': [{'type': 'identity', 'id': None}]}}
)
self.ks3_client_builder = self.patch(
'refstack_client.refstack_client.ksclient3.Client',
return_value=self.mock_ks3_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v3'
)
@httmock.urlmatch(netloc=r'(.*\.)?127.0.0.1$', path='/v3/auth/tokens')
def keystone_api_v3_mock(auth_version, url, request):
return ks3_ID_None
with httmock.HTTMock(keystone_api_v3_mock):
client._get_cpid_from_keystone(auth_version, auth_url, content)
client._generate_cpid_from_endpoint.assert_called_with(auth_url)
# Test when the catalog is empty.
self.mock_ks3_client = MagicMock(
name='ks_client',
**{'auth_ref': {'catalog': []}}
)
self.ks3_client_builder = self.patch(
'refstack_client.refstack_client.ksclient3.Client',
return_value=self.mock_ks3_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v3'
)
ks3_catalog_empty = {'auth_ref': {'catalog': []}}
@httmock.urlmatch(netloc=r'(.*\.)?127.0.0.1$', path='/v3/auth/tokens')
def keystone_api_v3_mock(auth_version, url, request):
return ks3_catalog_empty
with httmock.HTTMock(keystone_api_v3_mock):
client._get_cpid_from_keystone(auth_version, auth_url, content)
client._generate_cpid_from_endpoint.assert_called_with(auth_url)
# Test when there is no service catalog.
self.mock_ks3_client = MagicMock(name='ks_client', **{'auth_ref': {}})
self.ks3_client_builder = self.patch(
'refstack_client.refstack_client.ksclient3.Client',
return_value=self.mock_ks3_client
)
client._get_cpid_from_keystone(client.conf)
# Failover CPID should be generated.
client._generate_cpid_from_endpoint.assert_called_with(
'http://0.0.0.0:35357/v3'
)
ks3_no_catalog = {'auth_ref': {}}
@httmock.urlmatch(netloc=r'(.*\.)?127.0.0.1$', path='/v3/auth/tokens')
def keystone_api_v3_mock(auth_version, url, request):
return ks3_no_catalog
with httmock.HTTMock(keystone_api_v3_mock):
client._get_cpid_from_keystone(auth_version, auth_url, content)
client._generate_cpid_from_endpoint.assert_called_with(auth_url)
#Test when catalog has other non-identity services.
self.mock_ks3_client = MagicMock(
name='ks_client',
**{'auth_ref': {'catalog': [{'type': 'compute',
'id': 'test-id1'},
ks3_other_services = {'token': {'catalog': [{'type': 'compute',
'id': 'test-id1'},
{'type': 'identity',
'id': 'test-id2'}]}}
)
self.ks3_client_builder = self.patch(
'refstack_client.refstack_client.ksclient3.Client',
return_value=self.mock_ks3_client
)
cpid = client._get_cpid_from_keystone(client.conf)
self.assertEqual('test-id2', cpid)
headers = {'content-type': 'application/json'}
@httmock.urlmatch(netloc=r'(.*\.)?127.0.0.1$', path='/v3/auth/tokens')
def keystone_api_v3_mock(auth_version, url, request):
return ks3_other_services
with httmock.HTTMock(keystone_api_v3_mock):
client._get_cpid_from_keystone(auth_version, auth_url, content)
requests.post.assert_called_with(auth_url,
data=json.dumps(content),
headers=headers,
verify=True)
def test_get_cpid_from_keystone_failure_handled(self):
"""Test that get cpid from keystone API failure handled."""
args = rc.parse_cli_args(self.mock_argv())
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
client._prep_test()
client.conf.set('identity', 'tenant_name', 'tenant_name')
client.logger.warning = MagicMock()
client._generate_cpid_from_endpoint = MagicMock()
self.mock_data()
configs = client._get_keystone_config(client.conf)
auth_version, url, content = client._generate_keystone_data(configs)
@httmock.urlmatch(netloc=r'(.*\.)?127.0.0.1$', path='/v2/tokens')
def keystone_api_mock(auth_version, url, request):
return None
with httmock.HTTMock(keystone_api_mock):
client._get_cpid_from_keystone(auth_version, url, content)
client._generate_cpid_from_endpoint.assert_called_with(url)
def test_generate_cpid_from_endpoint(self):
"""
@ -589,11 +453,9 @@ class TestRefstackClient(unittest.TestCase):
with httmock.HTTMock(refstack_api_mock):
client.post_results("http://127.0.0.1", content)
client.logger.info.assert_called_with(
'http://127.0.0.1/v1/results/ Response: '
'%s' % expected_response
)
client.logger.info.assert_called_with(
'http://127.0.0.1/v1/results/ Response: '
'%s' % expected_response)
def test_post_results_with_sign(self):
"""
@ -616,10 +478,9 @@ class TestRefstackClient(unittest.TestCase):
with httmock.HTTMock(refstack_api_mock):
client.post_results("http://127.0.0.1", content,
sign_with=self.test_path + '/rsa_key')
client.logger.info.assert_called_with(
'http://127.0.0.1/v1/results/ Response: '
'%s' % expected_response
)
client.logger.info.assert_called_with(
'http://127.0.0.1/v1/results/ Response: '
'%s' % expected_response)
def test_run_tempest(self):
"""
@ -634,11 +495,13 @@ class TestRefstackClient(unittest.TestCase):
'refstack_client.refstack_client.subprocess.Popen',
return_value=MagicMock(returncode=0))
self.patch("os.path.isfile", return_value=True)
self.mock_keystone()
self.mock_data()
client.get_passed_tests = MagicMock(return_value=[{'name': 'test'}])
client.logger.info = MagicMock()
client._save_json_results = MagicMock()
client.post_results = MagicMock()
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client.test()
mock_popen.assert_called_with(
@ -664,10 +527,13 @@ class TestRefstackClient(unittest.TestCase):
'refstack_client.refstack_client.subprocess.Popen',
return_value=MagicMock(returncode=0))
self.patch("os.path.isfile", return_value=True)
self.mock_keystone()
self.mock_data()
client.get_passed_tests = MagicMock(return_value=['test'])
client.post_results = MagicMock()
client._save_json_results = MagicMock()
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client._get_cpid_from_keystone = MagicMock()
client.test()
mock_popen.assert_called_with(
['%s/run_tempest.sh' % self.test_path, '-C', self.conf_file_name,
@ -693,10 +559,14 @@ class TestRefstackClient(unittest.TestCase):
return_value=MagicMock(returncode=0)
)
self.patch("os.path.isfile", return_value=True)
self.mock_keystone()
self.mock_data()
client.get_passed_tests = MagicMock(return_value=['test'])
client.post_results = MagicMock()
client._save_json_results = MagicMock()
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client._get_cpid_from_keystone = MagicMock(
return_value='test-id')
client.test()
mock_popen.assert_called_with(
['%s/run_tempest.sh' % self.test_path, '-C', self.conf_file_name,
@ -724,12 +594,14 @@ class TestRefstackClient(unittest.TestCase):
'refstack_client.refstack_client.subprocess.Popen',
return_value=MagicMock(returncode=0))
self.patch("os.path.isfile", return_value=True)
self.mock_keystone()
self.mock_data()
client.get_passed_tests = MagicMock(return_value=[{'name': 'test'}])
client._save_json_results = MagicMock()
client.post_results = MagicMock()
lp.TestListParser.get_normalized_test_list = MagicMock(
return_value="/tmp/some-list")
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client.test()
lp.TestListParser.get_normalized_test_list.assert_called_with(
@ -773,9 +645,13 @@ class TestRefstackClient(unittest.TestCase):
'refstack_client.refstack_client.subprocess.Popen',
return_value=MagicMock(returncode=0))
self.patch("os.path.isfile", return_value=True)
self.mock_keystone()
self.mock_data()
client.get_passed_tests = MagicMock(return_value=['test'])
client._save_json_results = MagicMock()
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client._get_cpid_from_keystone = MagicMock(
return_value='test-id')
client.test()
mock_popen.assert_called_with(
@ -796,11 +672,14 @@ class TestRefstackClient(unittest.TestCase):
"""
self.patch('refstack_client.refstack_client.subprocess.Popen',
return_value=MagicMock(returncode=1))
self.mock_keystone()
args = rc.parse_cli_args(self.mock_argv(verbose='-vv'))
client = rc.RefstackClient(args)
client.tempest_dir = self.test_path
self.mock_data()
client.logger.error = MagicMock()
client._get_keystone_config = MagicMock(
return_value=self.v2_config)
client._get_cpid_from_keystone = MagicMock()
client.test()
self.assertTrue(client.logger.error.called)

View File

@ -1,4 +1,3 @@
python-keystoneclient>=0.10.0
gitpython>=0.3.2.RC1
python-subunit>=0.0.18
pycrypto>=2.6.1