fix mistral-client use does not use endpoint keystone:

* add: --os-mistral-version, --os-mistral-service-type, --os-mistral-endpoint-type
	* use endpoint_type for get endpoint ip

Change-Id: Iae2ece77aff3079faf63213cf3777eaca426caeb
Closes-Bug: #1465570
This commit is contained in:
Limor Stotland 2015-06-16 15:02:16 +00:00
parent 1389beb6d5
commit 02a1bbaf46
7 changed files with 198 additions and 41 deletions

View File

@ -25,9 +25,6 @@ def client(mistral_url=None, username=None, api_key=None,
if mistral_url and not isinstance(mistral_url, six.string_types):
raise RuntimeError('Mistral url should be a string.')
if not mistral_url:
mistral_url = "http://localhost:8989/v2"
return client_v2.Client(
mistral_url=mistral_url,
username=username,
@ -43,8 +40,8 @@ def client(mistral_url=None, username=None, api_key=None,
)
def determine_client_version(mistral_url):
if mistral_url.find("v2") != -1:
def determine_client_version(mistral_version):
if mistral_version.find("v2") != -1:
return 2
raise RuntimeError("Can not determine mistral API version")

View File

@ -97,7 +97,8 @@ class Client(object):
)
if service_type in catalog:
service = catalog.get(service_type)
mistral_url = service[0].get('url') if service else None
mistral_url = service[0].get(
endpoint_type) if service else None
return mistral_url, token, project_id, user_id

View File

@ -180,10 +180,35 @@ class MistralShell(app.App):
'--os-mistral-url',
action='store',
dest='mistral_url',
default=c.env('OS_MISTRAL_URL',
default='http://localhost:8989/v2'),
default=c.env('OS_MISTRAL_URL'),
help='Mistral API host (Env: OS_MISTRAL_URL)'
)
parser.add_argument(
'--os-mistral-version',
action='store',
dest='mistral_version',
default=c.env('OS_MISTRAL_VERSION', default='v2'),
help='Mistral API version (default = v2) (Env: '
'OS_MISTRAL_VERSION)'
)
parser.add_argument(
'--os-mistral-service-type',
action='store',
dest='service_type',
default=c.env('OS_MISTRAL_SERVICE_TYPE', default='workflowv2'),
help='Mistral service-type (should be the same name as in '
'keystone-endpoint) (default = workflowv2) (Env: '
'OS_MISTRAL_SERVICE_TYPE)'
)
parser.add_argument(
'--os-mistral-endpoint-type',
action='store',
dest='endpoint_type',
default=c.env('OS_MISTRAL_ENDPOINT_TYPE', default='publicURL'),
help='Mistral endpoint-type (should be the same name as in '
'keystone-endpoint) (default = publicURL) (Env: '
'OS_MISTRAL_ENDPOINT_TYPE)'
)
parser.add_argument(
'--os-username',
action='store',
@ -238,7 +263,7 @@ class MistralShell(app.App):
def initialize_app(self, argv):
self._clear_shell_commands()
ver = client.determine_client_version(self.options.mistral_url)
ver = client.determine_client_version(self.options.mistral_version)
self._set_shell_commands(self._get_commands(ver))
@ -248,8 +273,8 @@ class MistralShell(app.App):
project_name=self.options.tenant_name,
auth_url=self.options.auth_url,
project_id=self.options.tenant_id,
endpoint_type='publicURL',
service_type='workflow',
endpoint_type=self.options.endpoint_type,
service_type=self.options.service_type,
auth_token=self.options.token,
cacert=self.options.cacert)

View File

@ -0,0 +1,47 @@
# Copyright 2015 Huawei Technologies Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import six
import testtools
from mistralclient import shell
class BaseShellTests(testtools.TestCase):
def shell(self, argstr):
orig = (sys.stdout, sys.stderr)
clean_env = {}
_old_env, os.environ = os.environ, clean_env.copy()
try:
sys.stdout = six.moves.cStringIO()
sys.stderr = six.moves.cStringIO()
_shell = shell.MistralShell()
_shell.run(argstr.split())
except SystemExit:
exc_type, exc_value, exc_traceback = sys.exc_info()
self.assertEqual(exc_value.code, 0)
finally:
stdout = sys.stdout.getvalue()
stderr = sys.stderr.getvalue()
sys.stdout.close()
sys.stderr.close()
sys.stdout, sys.stderr = orig
os.environ = _old_env
return stdout, stderr

View File

@ -0,0 +1,32 @@
# Copyright 2015 Huawei Technologies Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
import testtools
from mistralclient.api import client
class BaseClientTests(testtools.TestCase):
@mock.patch('keystoneclient.v3.client.Client')
@mock.patch('mistralclient.api.httpclient.HTTPClient')
def test_mistral_url_defult(self, mock, keystone_client_mock):
client.client(username='mistral',
project_name='misteal',
auth_url="http://localhost:35357/v3")
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[0][0],
'http://localhost:8989/v2')

View File

@ -0,0 +1,83 @@
# Copyright 2015 Huawei Technologies Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
import mistralclient.tests.unit.base_shell_test as base
class TestShell(base.BaseShellTests):
@mock.patch('mistralclient.api.client.client')
def test_command_no_mistral_url(self, mock):
self.shell(
'workbook-list'
)
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[1]['mistral_url'], '')
@mock.patch('mistralclient.api.client.client')
def test_command_with_mistral_url(self, mock):
self.shell(
'--os-mistral-url=http://localhost:8989/v2 workbook-list'
)
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[1]['mistral_url'],
'http://localhost:8989/v2')
@mock.patch('mistralclient.api.client.determine_client_version')
def test_mistral_version(self, mock):
self.shell(
'--os-mistral-version=v1 workbook-list'
)
self.assertTrue(mock.called)
mistral_version = mock.call_args
self.assertEqual(mistral_version[0][0], 'v1')
@mock.patch('mistralclient.api.client.determine_client_version')
def test_no_mistral_version(self, mock):
self.shell('workbook-list')
self.assertTrue(mock.called)
mistral_version = mock.call_args
self.assertEqual(mistral_version[0][0], 'v2')
@mock.patch('mistralclient.api.client.client')
def test_service_type(self, mock):
self.shell('--os-mistral-service-type=test workbook-list')
self.assertTrue(mock.called)
parmters = mock.call_args
self.assertEqual(parmters[1]['service_type'], 'test')
@mock.patch('mistralclient.api.client.client')
def test_no_service_type(self, mock):
self.shell('workbook-list')
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[1]['service_type'], 'workflowv2')
@mock.patch('mistralclient.api.client.client')
def test_endpoint_type(self, mock):
self.shell('--os-mistral-endpoint-type=adminURL workbook-list')
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[1]['endpoint_type'], 'adminURL')
@mock.patch('mistralclient.api.client.client')
def test_no_endpoint_type(self, mock):
self.shell('workbook-list')
self.assertTrue(mock.called)
params = mock.call_args
self.assertEqual(params[1]['endpoint_type'], 'publicURL')

View File

@ -12,38 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import six
import testtools
from mistralclient import shell
import mistralclient.tests.unit.base_shell_test as base
class TestCLIBashCompletionV2(testtools.TestCase):
def shell(self, argstr):
orig = (sys.stdout, sys.stderr)
clean_env = {}
_old_env, os.environ = os.environ, clean_env.copy()
try:
sys.stdout = six.moves.cStringIO()
sys.stderr = six.moves.cStringIO()
_shell = shell.MistralShell()
_shell.run(argstr.split())
except SystemExit:
exc_type, exc_value, exc_traceback = sys.exc_info()
self.assertEqual(exc_value.code, 0)
finally:
stdout = sys.stdout.getvalue()
stderr = sys.stderr.getvalue()
sys.stdout.close()
sys.stderr.close()
sys.stdout, sys.stderr = orig
os.environ = _old_env
return stdout, stderr
class TestCLIBashCompletionV2(base.BaseShellTests):
def test_bash_completion(self):
bash_completion, stderr = self.shell('bash-completion')