Reverted "Add keystone v3 support to client"
Reverts 90c05dc70c
It broke functional tests in murano and because of that
it was reverted.
Change-Id: If45cc114ca89fb0df80d6889fad34578c092e2d6
This commit is contained in:
@@ -18,7 +18,6 @@ import logging
|
||||
import os
|
||||
import socket
|
||||
|
||||
import keystoneclient.adapter as keystone_adapter
|
||||
from oslo.serialization import jsonutils
|
||||
from oslo.utils import encodeutils
|
||||
import requests
|
||||
@@ -292,81 +291,3 @@ class HTTPClient(object):
|
||||
|
||||
def patch(self, url, **kwargs):
|
||||
return self.client_request("PATCH", url, **kwargs)
|
||||
|
||||
|
||||
class SessionClient(keystone_adapter.LegacyJsonAdapter):
|
||||
|
||||
def request(self, url, method, **kwargs):
|
||||
raise_exc = kwargs.pop('raise_exc', True)
|
||||
resp, body = super(SessionClient, self).request(url,
|
||||
method,
|
||||
raise_exc=False,
|
||||
**kwargs)
|
||||
|
||||
if raise_exc and resp.status_code >= 400:
|
||||
raise exc.from_response(resp)
|
||||
|
||||
return resp, body
|
||||
|
||||
def json_request(self, method, url, **kwargs):
|
||||
# Legacy adapter expects the payload in 'body', but
|
||||
# will pass it to the non-legacy adapter in the
|
||||
# 'json' spot so encoding happens later
|
||||
if 'data' in kwargs:
|
||||
if 'body' in kwargs:
|
||||
raise ValueError("Can't provide both 'data' and "
|
||||
"'body' to a request")
|
||||
kwargs['body'] = kwargs.pop('data')
|
||||
|
||||
# The argument order is different, beware
|
||||
return self.request(url, method, **kwargs)
|
||||
|
||||
def json_patch_request(self, url, method='PATCH', **kwargs):
|
||||
content_type = 'application/murano-packages-json-patch'
|
||||
return self.json_request(
|
||||
method, url, content_type=content_type, **kwargs)
|
||||
|
||||
def raw_request(self, method, url, **kwargs):
|
||||
# A non-json request; instead of calling
|
||||
# super.request, need to call the grandparent
|
||||
# adapter.request
|
||||
raise_exc = kwargs.pop('raise_exc', True)
|
||||
if 'body' in kwargs:
|
||||
if 'data' in kwargs:
|
||||
raise ValueError("Can't provide both 'data' and "
|
||||
"'body' to a request")
|
||||
kwargs['data'] = kwargs.pop('body')
|
||||
resp = keystone_adapter.Adapter.request(self,
|
||||
url,
|
||||
method,
|
||||
raise_exc=False,
|
||||
**kwargs)
|
||||
body = resp.text
|
||||
|
||||
if raise_exc and resp.status_code >= 400:
|
||||
raise exc.from_response(resp)
|
||||
|
||||
return resp, body
|
||||
|
||||
|
||||
def _construct_http_client(*args, **kwargs):
|
||||
session = kwargs.pop('session', None)
|
||||
auth = kwargs.pop('auth', None)
|
||||
endpoint = next(iter(args), None)
|
||||
|
||||
if session:
|
||||
service_type = kwargs.pop('service_type', None)
|
||||
endpoint_type = kwargs.pop('endpoint_type', None)
|
||||
region_name = kwargs.pop('region_name', None)
|
||||
service_name = kwargs.pop('service_name', None)
|
||||
return SessionClient(endpoint_override=endpoint,
|
||||
session=session,
|
||||
auth=auth,
|
||||
interface=endpoint_type,
|
||||
service_type=service_type,
|
||||
region_name=region_name,
|
||||
service_name=service_name,
|
||||
user_agent='python-muranoclient',
|
||||
**kwargs)
|
||||
else:
|
||||
return HTTPClient(*args, **kwargs)
|
||||
|
||||
@@ -22,14 +22,11 @@ import argparse
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from keystoneclient.auth.identity.generic import password
|
||||
from keystoneclient.auth.identity.generic import token
|
||||
from keystoneclient.auth.identity import v3 as identity
|
||||
from keystoneclient import session as ksession
|
||||
from keystoneclient.v2_0 import client as ksclient
|
||||
from oslo.utils import encodeutils
|
||||
import six
|
||||
|
||||
from muranoclient import client as murano_client
|
||||
from muranoclient import client as apiclient
|
||||
from muranoclient.common import utils
|
||||
from muranoclient.openstack.common.apiclient import exceptions as exc
|
||||
|
||||
@@ -38,15 +35,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class MuranoShell(object):
|
||||
|
||||
def _append_global_identity_args(self, parser):
|
||||
# Register the CLI arguments that have moved to the session object.
|
||||
ksession.Session.register_cli_options(parser)
|
||||
|
||||
identity.Password.register_argparse_arguments(parser)
|
||||
|
||||
def get_base_parser(self):
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='murano',
|
||||
description=__doc__.strip(),
|
||||
@@ -70,25 +59,52 @@ class MuranoShell(object):
|
||||
default=False, action="store_true",
|
||||
help="Print more verbose output")
|
||||
|
||||
# os-cert, os-key, insecure, ca-file are all added
|
||||
# by keystone session register_cli_opts later
|
||||
parser.add_argument('-k', '--insecure',
|
||||
default=False,
|
||||
action='store_true',
|
||||
help="Explicitly allow muranoclient to perform "
|
||||
"\"insecure\" SSL (https) requests. "
|
||||
"The server's certificate will "
|
||||
"not be verified against any certificate "
|
||||
"authorities. This option should be used "
|
||||
"with caution.")
|
||||
|
||||
parser.add_argument('--os-cacert',
|
||||
metavar='<ca-certificate>',
|
||||
default=utils.env('OS_CACERT', default=None),
|
||||
help='Specify a CA bundle file to use in '
|
||||
'verifying a TLS (https) server certificate. '
|
||||
'Defaults to env[OS_CACERT]')
|
||||
|
||||
parser.add_argument('--cert-file',
|
||||
dest='os_cert',
|
||||
help='DEPRECATED! Use --os-cert.')
|
||||
help='Path of certificate file to use in SSL '
|
||||
'connection. This file can optionally be '
|
||||
'prepended with the private key.')
|
||||
|
||||
parser.add_argument('--key-file',
|
||||
dest='os_key',
|
||||
help='DEPRECATED! Use --os-key.')
|
||||
help='Path of client key to use in SSL connection.'
|
||||
' This option is not necessary if your '
|
||||
'key is prepended to your cert file.')
|
||||
|
||||
parser.add_argument('--ca-file',
|
||||
dest='os_cacert',
|
||||
help='DEPRECATED! Use --os-cacert.')
|
||||
help='Path of CA SSL certificate(s) used to verify'
|
||||
' the remote server certificate. Without '
|
||||
'this option glance looks for the default '
|
||||
'system CA certificates.')
|
||||
|
||||
parser.add_argument('--api-timeout',
|
||||
help='Number of seconds to wait for an '
|
||||
'API response, '
|
||||
'defaults to system socket timeout')
|
||||
|
||||
parser.add_argument('--os-username',
|
||||
default=utils.env('OS_USERNAME'),
|
||||
help='Defaults to env[OS_USERNAME]')
|
||||
|
||||
parser.add_argument('--os-password',
|
||||
default=utils.env('OS_PASSWORD'),
|
||||
help='Defaults to env[OS_PASSWORD]')
|
||||
|
||||
parser.add_argument('--os-tenant-id',
|
||||
default=utils.env('OS_TENANT_ID'),
|
||||
help='Defaults to env[OS_TENANT_ID]')
|
||||
@@ -97,6 +113,10 @@ class MuranoShell(object):
|
||||
default=utils.env('OS_TENANT_NAME'),
|
||||
help='Defaults to env[OS_TENANT_NAME]')
|
||||
|
||||
parser.add_argument('--os-auth-url',
|
||||
default=utils.env('OS_AUTH_URL'),
|
||||
help='Defaults to env[OS_AUTH_URL]')
|
||||
|
||||
parser.add_argument('--os-region-name',
|
||||
default=utils.env('OS_REGION_NAME'),
|
||||
help='Defaults to env[OS_REGION_NAME]')
|
||||
@@ -110,6 +130,7 @@ class MuranoShell(object):
|
||||
action='store_true',
|
||||
help="Do not contact keystone for a token. "
|
||||
"Defaults to env[OS_NO_CLIENT_AUTH].")
|
||||
|
||||
parser.add_argument('--murano-url',
|
||||
default=utils.env('MURANO_URL'),
|
||||
help='Defaults to env[MURANO_URL]')
|
||||
@@ -133,8 +154,6 @@ class MuranoShell(object):
|
||||
action='store_true',
|
||||
help='Send os-username and os-password to murano.')
|
||||
|
||||
self._append_global_identity_args(parser)
|
||||
|
||||
return parser
|
||||
|
||||
def get_subcommand_parser(self, version):
|
||||
@@ -177,20 +196,38 @@ class MuranoShell(object):
|
||||
subparser.add_argument(*args, **kwargs)
|
||||
subparser.set_defaults(func=callback)
|
||||
|
||||
def _get_keystone_auth(self, session, auth_url, **kwargs):
|
||||
auth_token = kwargs.pop('auth_token', None)
|
||||
if auth_token:
|
||||
return token.Token(auth_url, auth_token, **kwargs)
|
||||
def _get_ksclient(self, **kwargs):
|
||||
"""Get an endpoint and 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
|
||||
"""
|
||||
kc_args = {
|
||||
'auth_url': kwargs.get('auth_url'),
|
||||
'insecure': kwargs.get('insecure'),
|
||||
'cacert': kwargs.get('cacert')}
|
||||
|
||||
if kwargs.get('tenant_id'):
|
||||
kc_args['tenant_id'] = kwargs.get('tenant_id')
|
||||
else:
|
||||
user_domain_id = kwargs.pop('user_domain_id')
|
||||
user_domain_name = kwargs.pop('user_domain_name')
|
||||
return password.Password(auth_url,
|
||||
username=kwargs.pop('username'),
|
||||
user_id=kwargs.pop('user_id'),
|
||||
password=kwargs.pop('password'),
|
||||
user_domain_id=user_domain_id,
|
||||
user_domain_name=user_domain_name,
|
||||
**kwargs)
|
||||
kc_args['tenant_name'] = kwargs.get('tenant_name')
|
||||
|
||||
if kwargs.get('token'):
|
||||
kc_args['token'] = kwargs.get('token')
|
||||
else:
|
||||
kc_args['username'] = kwargs.get('username')
|
||||
kc_args['password'] = kwargs.get('password')
|
||||
|
||||
return ksclient.Client(**kc_args)
|
||||
|
||||
def _get_endpoint(self, client, **kwargs):
|
||||
"""Get an endpoint using the provided keystone client."""
|
||||
return client.service_catalog.url_for(
|
||||
service_type=kwargs.get('service_type') or 'application_catalog',
|
||||
endpoint_type=kwargs.get('endpoint_type') or 'publicURL')
|
||||
|
||||
def _setup_logging(self, debug):
|
||||
log_lvl = logging.DEBUG if debug else logging.WARNING
|
||||
@@ -214,9 +251,6 @@ class MuranoShell(object):
|
||||
subcommand_parser = self.get_subcommand_parser(api_version)
|
||||
self.parser = subcommand_parser
|
||||
|
||||
keystone_session = None
|
||||
keystone_auth = None
|
||||
|
||||
# Handle top-level --help/-h before attempting to parse
|
||||
# a command off the command line.
|
||||
if (not args and options.help) or not argv:
|
||||
@@ -240,14 +274,11 @@ class MuranoShell(object):
|
||||
" or a token via --os-auth-token or"
|
||||
" env[OS_AUTH_TOKEN]")
|
||||
|
||||
if not any([args.os_tenant_name, args.os_tenant_id,
|
||||
args.os_project_id, args.os_project_name]):
|
||||
raise exc.CommandError("You must provide a project name or"
|
||||
" project id via --os-project-name,"
|
||||
" --os-project-id, env[OS_PROJECT_ID]"
|
||||
" or env[OS_PROJECT_NAME]. You may"
|
||||
" use os-project and os-tenant"
|
||||
" interchangeably.")
|
||||
if not args.os_password and not args.os_auth_token:
|
||||
raise exc.CommandError("You must provide a password via"
|
||||
" either --os-password or env[OS_PASSWORD]"
|
||||
" or a token via --os-auth-token or"
|
||||
" env[OS_AUTH_TOKEN]")
|
||||
|
||||
if args.os_no_client_auth:
|
||||
if not args.murano_url:
|
||||
@@ -260,76 +291,58 @@ class MuranoShell(object):
|
||||
# service catalog, it's not required if os_no_client_auth is
|
||||
# specified, neither is the auth URL.
|
||||
if not (args.os_tenant_id or args.os_tenant_name):
|
||||
raise exc.CommandError(
|
||||
"You must provide a tenant name "
|
||||
"or tenant id via --os-tenant-name, "
|
||||
"--os-tenant-id, env[OS_TENANT_NAME] "
|
||||
"or env[OS_TENANT_ID] OR a project name "
|
||||
"or project id via --os-project-name, "
|
||||
"--os-project-id, env[OS_PROJECT_ID] or "
|
||||
"env[OS_PROJECT_NAME]")
|
||||
raise exc.CommandError("You must provide a tenant name "
|
||||
"or tenant id via --os-tenant-name, "
|
||||
"--os-tenant-id, env[OS_TENANT_NAME] "
|
||||
"or env[OS_TENANT_ID]")
|
||||
|
||||
if not args.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': args.os_username,
|
||||
'password': args.os_password,
|
||||
'token': args.os_auth_token,
|
||||
'tenant_id': args.os_tenant_id,
|
||||
'tenant_name': args.os_tenant_name,
|
||||
'auth_url': args.os_auth_url,
|
||||
'service_type': args.os_service_type,
|
||||
'endpoint_type': args.os_endpoint_type,
|
||||
'insecure': args.insecure,
|
||||
'cacert': args.os_cacert,
|
||||
'include_pass': args.include_password
|
||||
}
|
||||
|
||||
endpoint = args.murano_url
|
||||
|
||||
if args.os_no_client_auth:
|
||||
# Authenticate through murano, don't use session
|
||||
if not args.os_no_client_auth:
|
||||
_ksclient = self._get_ksclient(**kwargs)
|
||||
token = args.os_auth_token or _ksclient.auth_token
|
||||
|
||||
kwargs = {
|
||||
'token': token,
|
||||
'insecure': args.insecure,
|
||||
'ca_file': args.ca_file,
|
||||
'cert_file': args.cert_file,
|
||||
'key_file': args.key_file,
|
||||
'username': args.os_username,
|
||||
'password': args.os_password,
|
||||
'auth_token': args.os_auth_token,
|
||||
'auth_url': args.os_auth_url,
|
||||
'token': args.os_auth_token,
|
||||
'insecure': args.insecure,
|
||||
'timeout': args.api_timeout
|
||||
'endpoint_type': args.os_endpoint_type,
|
||||
'include_pass': args.include_password
|
||||
}
|
||||
else:
|
||||
# Create a keystone session and keystone auth
|
||||
keystone_session = ksession.Session.load_from_cli_options(args)
|
||||
project_id = args.os_project_id or args.os_tenant_id
|
||||
project_name = args.os_project_name or args.os_tenant_name
|
||||
|
||||
keystone_session = ksession.Session.load_from_cli_options(args)
|
||||
|
||||
keystone_auth = self._get_keystone_auth(
|
||||
keystone_session,
|
||||
args.os_auth_url,
|
||||
username=args.os_username,
|
||||
user_id=args.os_user_id,
|
||||
user_domain_id=args.os_user_domain_id,
|
||||
user_domain_name=args.os_user_domain_name,
|
||||
password=args.os_password,
|
||||
auth_token=args.os_auth_token,
|
||||
project_id=project_id,
|
||||
project_name=project_name,
|
||||
project_domain_id=args.os_project_domain_id,
|
||||
project_domain_name=args.os_project_domain_name)
|
||||
|
||||
endpoint_type = args.os_endpoint_type or 'publicURL'
|
||||
service_type = args.os_service_type or 'application_catalog'
|
||||
if args.os_region_name:
|
||||
kwargs['region_name'] = args.os_region_name
|
||||
|
||||
if not endpoint:
|
||||
endpoint = keystone_auth.get_endpoint(
|
||||
keystone_session,
|
||||
service_type=service_type,
|
||||
region_name=args.os_region_name)
|
||||
|
||||
kwargs = {
|
||||
'session': keystone_session,
|
||||
'auth': keystone_auth,
|
||||
'service_type': service_type,
|
||||
'endpoint_type': endpoint_type,
|
||||
'region_name': args.os_region_name,
|
||||
}
|
||||
endpoint = self._get_endpoint(_ksclient, **kwargs)
|
||||
|
||||
if args.api_timeout:
|
||||
kwargs['timeout'] = args.api_timeout
|
||||
|
||||
client = murano_client.Client(api_version, endpoint, **kwargs)
|
||||
client = apiclient.Client(api_version, endpoint, **kwargs)
|
||||
|
||||
args.func(client, args)
|
||||
|
||||
|
||||
@@ -18,11 +18,7 @@ import sys
|
||||
import tempfile
|
||||
|
||||
import fixtures
|
||||
from keystoneclient import fixture
|
||||
from keystoneclient.fixture import v2 as ks_v2_fixture
|
||||
from keystoneclient.fixture import v3 as ks_v3_fixture
|
||||
import mock
|
||||
import requests_mock
|
||||
import six
|
||||
from testtools import matchers
|
||||
|
||||
@@ -38,22 +34,12 @@ FIXTURE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
||||
FAKE_ENV = {'OS_USERNAME': 'username',
|
||||
'OS_PASSWORD': 'password',
|
||||
'OS_TENANT_NAME': 'tenant_name',
|
||||
'OS_AUTH_URL': 'http://no.where/v2.0'}
|
||||
'OS_AUTH_URL': 'http://no.where'}
|
||||
|
||||
FAKE_ENV2 = {'OS_USERNAME': 'username',
|
||||
'OS_PASSWORD': 'password',
|
||||
'OS_TENANT_ID': 'tenant_id',
|
||||
'OS_AUTH_URL': 'http://no.where/v2.0'}
|
||||
|
||||
FAKE_ENV_v3 = {'OS_USERNAME': 'username',
|
||||
'OS_PASSWORD': 'password',
|
||||
'OS_TENANT_ID': 'tenant_id',
|
||||
'OS_USER_DOMAIN_NAME': 'domain_name',
|
||||
'OS_AUTH_URL': 'http://no.where/3'}
|
||||
|
||||
|
||||
def _create_ver_list(versions):
|
||||
return {'versions': {'values': versions}}
|
||||
'OS_AUTH_URL': 'http://no.where'}
|
||||
|
||||
|
||||
class TestArgs(object):
|
||||
@@ -66,25 +52,19 @@ class ShellTest(base.TestCaseShell):
|
||||
env = dict((k, v) for k, v in fake_env.items() if k != exclude)
|
||||
self.useFixture(fixtures.MonkeyPatch('os.environ', env))
|
||||
|
||||
|
||||
class ShellCommandTest(ShellTest):
|
||||
|
||||
_msg_no_tenant_project = ('You must provide a project name or project'
|
||||
' id via --os-project-name, --os-project-id,'
|
||||
' env[OS_PROJECT_ID] or env[OS_PROJECT_NAME].'
|
||||
' You may use os-project and os-tenant'
|
||||
' interchangeably.',)
|
||||
|
||||
def setUp(self):
|
||||
super(ShellCommandTest, self).setUp()
|
||||
|
||||
def get_auth_endpoint(bound_self, args):
|
||||
return ('test', {})
|
||||
super(ShellTest, self).setUp()
|
||||
self.useFixture(fixtures.MonkeyPatch(
|
||||
'muranoclient.shell.MuranoShell._get_endpoint_and_kwargs',
|
||||
get_auth_endpoint))
|
||||
'keystoneclient.v2_0.client.Client', mock.MagicMock))
|
||||
self.client = mock.MagicMock()
|
||||
|
||||
# We don't set an endpoint (client.service_catalog.url_for is a mock)
|
||||
# and get_proxy_url doesn't like that. We don't care about testing
|
||||
# that functionality, so mock it out.
|
||||
self.useFixture(fixtures.MonkeyPatch(
|
||||
'muranoclient.common.http.HTTPClient.get_proxy_url',
|
||||
mock.MagicMock))
|
||||
|
||||
def shell(self, argstr, exitcodes=(0,)):
|
||||
orig = sys.stdout
|
||||
orig_stderr = sys.stderr
|
||||
@@ -105,21 +85,6 @@ class ShellCommandTest(ShellTest):
|
||||
sys.stderr = orig_stderr
|
||||
return (stdout, stderr)
|
||||
|
||||
def register_keystone_discovery_fixture(self, mreq):
|
||||
v2_url = "http://no.where/v2.0"
|
||||
v2_version = fixture.V2Discovery(v2_url)
|
||||
mreq.register_uri('GET', v2_url, json=_create_ver_list([v2_version]),
|
||||
status_code=200)
|
||||
|
||||
def register_keystone_token_fixture(self, mreq):
|
||||
v2_token = ks_v2_fixture.Token(token_id='token')
|
||||
service = v2_token.add_service('application_catalog')
|
||||
service.add_endpoint('http://no.where', region='RegionOne')
|
||||
mreq.register_uri('POST',
|
||||
'http://no.where/v2.0/tokens',
|
||||
json=v2_token,
|
||||
status_code=200)
|
||||
|
||||
def test_help_unknown_command(self):
|
||||
self.assertRaises(exceptions.CommandError, self.shell, 'help foofoo')
|
||||
|
||||
@@ -168,7 +133,10 @@ class ShellCommandTest(ShellTest):
|
||||
self.fail('CommandError not raised')
|
||||
|
||||
def test_no_tenant_name(self):
|
||||
required = self._msg_no_tenant_project
|
||||
required = ('You must provide a tenant name '
|
||||
'or tenant id via --os-tenant-name, '
|
||||
'--os-tenant-id, env[OS_TENANT_NAME] '
|
||||
'or env[OS_TENANT_ID]',)
|
||||
self.make_env(exclude='OS_TENANT_NAME')
|
||||
try:
|
||||
self.shell('package-list')
|
||||
@@ -178,7 +146,10 @@ class ShellCommandTest(ShellTest):
|
||||
self.fail('CommandError not raised')
|
||||
|
||||
def test_no_tenant_id(self):
|
||||
required = self._msg_no_tenant_project
|
||||
required = ('You must provide a tenant name '
|
||||
'or tenant id via --os-tenant-name, '
|
||||
'--os-tenant-id, env[OS_TENANT_NAME] '
|
||||
'or env[OS_TENANT_ID]',)
|
||||
self.make_env(exclude='OS_TENANT_ID', fake_env=FAKE_ENV2)
|
||||
try:
|
||||
self.shell('package-list')
|
||||
@@ -199,19 +170,15 @@ class ShellCommandTest(ShellTest):
|
||||
self.fail('CommandError not raised')
|
||||
|
||||
@mock.patch('muranoclient.v1.packages.PackageManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_package_list(self, mock_package_manager, m_requests):
|
||||
def test_package_list(self, mock_package_manager):
|
||||
self.client.packages = mock_package_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('package-list')
|
||||
self.client.packages.filter.assert_called_once_with(
|
||||
include_disabled=False)
|
||||
|
||||
@mock.patch('muranoclient.v1.packages.PackageManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_package_show(self, mock_package_manager, m_requests):
|
||||
def test_package_show(self, mock_package_manager):
|
||||
self.client.packages = mock_package_manager()
|
||||
mock_package = mock.MagicMock()
|
||||
mock_package.class_definitions = ''
|
||||
@@ -220,77 +187,57 @@ class ShellCommandTest(ShellTest):
|
||||
mock_package.description = ''
|
||||
self.client.packages.get.return_value = mock_package
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('package-show 1234')
|
||||
self.client.packages.get.assert_called_once_with('1234')
|
||||
|
||||
@mock.patch('muranoclient.v1.packages.PackageManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_package_delete(self, mock_package_manager, m_requests):
|
||||
def test_package_delete(self, mock_package_manager):
|
||||
self.client.packages = mock_package_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('package-delete 1234')
|
||||
self.client.packages.delete.assert_called_once_with('1234')
|
||||
|
||||
@mock.patch('muranoclient.v1.environments.EnvironmentManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_environment_delete(self, mock_manager, m_requests):
|
||||
def test_environment_delete(self, mock_manager):
|
||||
self.client.environments = mock_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('environment-delete env1 env2')
|
||||
self.client.environments.delete.assert_has_calls([
|
||||
mock.call('env1'), mock.call('env2')])
|
||||
|
||||
@mock.patch('muranoclient.v1.environments.EnvironmentManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_environment_rename(self, mock_manager, m_requests):
|
||||
def test_environment_rename(self, mock_manager):
|
||||
self.client.environments = mock_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('environment-rename env-id new-name')
|
||||
self.client.environments.update.assert_called_once_with(
|
||||
'env-id', 'new-name')
|
||||
|
||||
@mock.patch('muranoclient.v1.environments.EnvironmentManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_environment_show(self, mock_manager, m_requests):
|
||||
def test_environment_show(self, mock_manager):
|
||||
self.client.environments = mock_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('environment-show env-id')
|
||||
self.client.environments.get.assert_called_once_with('env-id')
|
||||
|
||||
@mock.patch('muranoclient.v1.deployments.DeploymentManager')
|
||||
@requests_mock.Mocker()
|
||||
def test_deployments_show(self, mock_manager, m_requests):
|
||||
def test_deployments_show(self, mock_manager):
|
||||
self.client.deployments = mock_manager()
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
self.shell('deployment-list env-id')
|
||||
self.client.deployments.list.assert_called_once_with('env-id')
|
||||
|
||||
|
||||
class ShellPackagesOperations(ShellCommandTest):
|
||||
class ShellPackagesOperations(ShellTest):
|
||||
def tearDown(self):
|
||||
super(ShellPackagesOperations, self).tearDown()
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_create_hot_based_package(self, m_requests):
|
||||
def test_create_hot_based_package(self):
|
||||
self.useFixture(fixtures.MonkeyPatch(
|
||||
'muranoclient.v1.client.Client', mock.MagicMock))
|
||||
heat_template = os.path.join(FIXTURE_DIR, 'heat-template.yaml')
|
||||
logo = os.path.join(FIXTURE_DIR, 'logo.png')
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
with tempfile.NamedTemporaryFile() as f:
|
||||
RESULT_PACKAGE = f.name
|
||||
c = "package-create --template={0} --output={1} -l={2}".format(
|
||||
@@ -300,16 +247,13 @@ class ShellPackagesOperations(ShellCommandTest):
|
||||
"Application package "
|
||||
"is available at {0}".format(RESULT_PACKAGE))
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_create_mpl_package(self, m_requests):
|
||||
def test_create_mpl_package(self):
|
||||
self.useFixture(fixtures.MonkeyPatch(
|
||||
'muranoclient.v1.client.Client', mock.MagicMock))
|
||||
classes_dir = os.path.join(FIXTURE_DIR, 'test-app', 'Classes')
|
||||
resources_dir = os.path.join(FIXTURE_DIR, 'test-app', 'Resources')
|
||||
ui = os.path.join(FIXTURE_DIR, 'test-app', 'ui.yaml')
|
||||
self.make_env()
|
||||
self.register_keystone_discovery_fixture(m_requests)
|
||||
self.register_keystone_token_fixture(m_requests)
|
||||
with tempfile.NamedTemporaryFile() as f:
|
||||
RESULT_PACKAGE = f.name
|
||||
stdout, stderr = self.shell(
|
||||
@@ -358,27 +302,3 @@ class ShellPackagesOperations(ShellCommandTest):
|
||||
|
||||
self.assertRaises(IOError,
|
||||
v1_shell.do_package_import, self.client, args)
|
||||
|
||||
|
||||
class ShellPackagesOperationsV3(ShellPackagesOperations):
|
||||
def make_env(self, exclude=None, fake_env=FAKE_ENV):
|
||||
if 'OS_AUTH_URL' in fake_env:
|
||||
fake_env.update({'OS_AUTH_URL': 'http://no.where/v3'})
|
||||
env = dict((k, v) for k, v in fake_env.items() if k != exclude)
|
||||
self.useFixture(fixtures.MonkeyPatch('os.environ', env))
|
||||
|
||||
def register_keystone_discovery_fixture(self, mreq):
|
||||
v3_url = "http://no.where/v3"
|
||||
v3_version = fixture.V3Discovery(v3_url)
|
||||
mreq.register_uri('GET', v3_url, json=_create_ver_list([v3_version]),
|
||||
status_code=200)
|
||||
|
||||
def register_keystone_token_fixture(self, mreq):
|
||||
v3_token = ks_v3_fixture.Token()
|
||||
service = v3_token.add_service('application_catalog')
|
||||
service.add_standard_endpoints(public='http://no.where')
|
||||
mreq.register_uri('POST',
|
||||
'http://no.where/v3/auth/tokens',
|
||||
json=v3_token,
|
||||
headers={'X-Subject-Token': 'tokenid'},
|
||||
status_code=200)
|
||||
|
||||
@@ -23,7 +23,7 @@ from muranoclient.v1 import services
|
||||
from muranoclient.v1 import sessions
|
||||
|
||||
|
||||
class Client(object):
|
||||
class Client(http.HTTPClient):
|
||||
"""Client for the Murano v1 API.
|
||||
|
||||
:param string endpoint: A user-supplied endpoint URL for the service.
|
||||
@@ -34,14 +34,14 @@ class Client(object):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Initialize a new client for the Murano v1 API."""
|
||||
self.http_client = http._construct_http_client(*args, **kwargs)
|
||||
self.environments = environments.EnvironmentManager(self.http_client)
|
||||
self.sessions = sessions.SessionManager(self.http_client)
|
||||
self.services = services.ServiceManager(self.http_client)
|
||||
self.deployments = deployments.DeploymentManager(self.http_client)
|
||||
super(Client, self).__init__(*args, **kwargs)
|
||||
self.environments = environments.EnvironmentManager(self)
|
||||
self.sessions = sessions.SessionManager(self)
|
||||
self.services = services.ServiceManager(self)
|
||||
self.deployments = deployments.DeploymentManager(self)
|
||||
self.request_statistics = \
|
||||
request_statistics.RequestStatisticsManager(self.http_client)
|
||||
request_statistics.RequestStatisticsManager(self)
|
||||
self.instance_statistics = \
|
||||
instance_statistics.InstanceStatisticsManager(self.http_client)
|
||||
self.packages = packages.PackageManager(self.http_client)
|
||||
self.actions = actions.ActionManager(self.http_client)
|
||||
instance_statistics.InstanceStatisticsManager(self)
|
||||
self.packages = packages.PackageManager(self)
|
||||
self.actions = actions.ActionManager(self)
|
||||
|
||||
@@ -12,13 +12,16 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import json
|
||||
import urllib
|
||||
|
||||
from oslo.serialization import jsonutils
|
||||
import requests
|
||||
import yaml
|
||||
|
||||
from muranoclient.common import base
|
||||
from muranoclient.common import exceptions
|
||||
from muranoclient.common import http
|
||||
|
||||
|
||||
DEFAULT_PAGE_SIZE = 20
|
||||
|
||||
@@ -50,17 +53,16 @@ class PackageManager(base.Manager):
|
||||
response_key='categories', obj_class=Category)
|
||||
|
||||
def create(self, data, files):
|
||||
response, body = self.api.raw_request(
|
||||
'POST',
|
||||
'/v1/catalog/packages',
|
||||
body=data,
|
||||
files=files,
|
||||
)
|
||||
data = {'data': json.dumps(data)}
|
||||
url = '{0}/v1/catalog/packages'.format(self.api.endpoint)
|
||||
headers = {'X-Auth-Token': self.api.auth_token}
|
||||
response = requests.post(url, data=data, files=files, headers=headers,
|
||||
verify=self.api.verify_cert)
|
||||
http.HTTPClient.log_http_response(response)
|
||||
if not response.ok:
|
||||
setattr(response, 'status', response.status_code)
|
||||
raise exceptions.from_response(response)
|
||||
body = jsonutils.loads(response.text)
|
||||
return self.resource_class(self, body)
|
||||
return self.resource_class(self, json.loads(response.content))
|
||||
|
||||
def get(self, app_id):
|
||||
return self._get('/v1/catalog/packages/{0}'.format(app_id))
|
||||
|
||||
@@ -8,7 +8,6 @@ discover
|
||||
fixtures>=0.3.14
|
||||
mock>=1.0
|
||||
tempest-lib
|
||||
requests-mock>=0.5.1 # Apache-2.0
|
||||
testrepository>=0.0.18
|
||||
testscenarios>=0.4
|
||||
testtools>=0.9.34
|
||||
|
||||
Reference in New Issue
Block a user