Merge "Adding Data Sources support to CLI"

This commit is contained in:
Jenkins 2015-08-31 10:10:49 +00:00 committed by Gerrit Code Review
commit 61db267d99
3 changed files with 386 additions and 0 deletions

View File

@ -0,0 +1,179 @@
# Copyright (c) 2015 Mirantis Inc.
#
# 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.
from cliff import command
from cliff import lister
from cliff import show
from openstackclient.common import utils as osc_utils
from oslo_log import log as logging
from saharaclient.osc.v1 import utils
class CreateDataSource(show.ShowOne):
"""Creates data source"""
log = logging.getLogger(__name__ + ".CreateDataSource")
def get_parser(self, prog_name):
parser = super(CreateDataSource, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar="<name>",
help="Name of the data source",
)
parser.add_argument(
'--type',
metavar="<type>",
choices=["swift", "hdfs", "maprfs"],
help="Type of the data source (swift, hdfs or maprfs) [REQUIRED]",
required=True
)
parser.add_argument(
'--url',
metavar="<url>",
help="Url for the data source [REQUIRED]",
required=True
)
parser.add_argument(
'--username',
metavar="<username>",
help="Username for accessing the data source url"
)
parser.add_argument(
'--password',
metavar="<password>",
help="Password for accessing the data source url"
)
parser.add_argument(
'--description',
metavar="<description>",
help="Description of the data source"
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.data_processing
description = parsed_args.description or ''
data = client.data_sources.create(
name=parsed_args.name, description=description,
data_source_type=parsed_args.type, url=parsed_args.url,
credential_user=parsed_args.username,
credential_pass=parsed_args.password).to_dict()
fields = ['name', 'id', 'type', 'url', 'description']
data = utils.prepare_data(data, fields)
return self.dict2columns(data)
class ListDataSources(lister.Lister):
"""Lists data sources"""
log = logging.getLogger(__name__ + ".ListDataSources")
def get_parser(self, prog_name):
parser = super(ListDataSources, self).get_parser(prog_name)
parser.add_argument(
'--long',
action='store_true',
default=False,
help='List additional fields in output',
)
parser.add_argument(
'--type',
metavar="<type>",
choices=["swift", "hdfs", "maprfs"],
help="List data sources of specific type (swift, hdfs or maprfs)"
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.data_processing
search_opts = {'type': parsed_args.type} if parsed_args.type else {}
data = client.data_sources.list(search_opts=search_opts)
if parsed_args.long:
columns = ('name', 'id', 'type', 'url', 'description')
column_headers = [c.capitalize() for c in columns]
else:
columns = ('name', 'id', 'type')
column_headers = [c.capitalize() for c in columns]
return (
column_headers,
(osc_utils.get_item_properties(
s,
columns
) for s in data)
)
class ShowDataSource(show.ShowOne):
"""Display data source details"""
log = logging.getLogger(__name__ + ".ShowDataSource")
def get_parser(self, prog_name):
parser = super(ShowDataSource, self).get_parser(prog_name)
parser.add_argument(
"data_source",
metavar="<data-source>",
help="Name or id of the data source to display",
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.data_processing
data = utils.get_resource(
client.data_sources, parsed_args.data_source).to_dict()
fields = ['name', 'id', 'type', 'url', 'description']
data = utils.prepare_data(data, fields)
return self.dict2columns(data)
class DeleteDataSource(command.Command):
"""Delete data source"""
log = logging.getLogger(__name__ + ".DeleteDataSource")
def get_parser(self, prog_name):
parser = super(DeleteDataSource, self).get_parser(prog_name)
parser.add_argument(
"data_source",
metavar="<data-source>",
help="Name or id of the data source to delete",
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
client = self.app.client_manager.data_processing
data_source_id = utils.get_resource(
client.data_sources, parsed_args.data_source).id
client.data_sources.delete(data_source_id)

View File

@ -0,0 +1,201 @@
# Copyright (c) 2015 Mirantis Inc.
#
# 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.
from openstackclient.tests import utils as osc_utils
from saharaclient.api import data_sources as api_ds
from saharaclient.osc.v1 import data_sources as osc_ds
from saharaclient.tests.unit.osc.v1 import fakes
DS_INFO = {'id': 'id', 'name': 'source', 'type': 'swift',
'url': 'swift://container.sahara/object',
'description': 'Data Source for tests'}
class TestDataSources(fakes.TestDataProcessing):
def setUp(self):
super(TestDataSources, self).setUp()
self.ds_mock = (
self.app.client_manager.data_processing.data_sources)
self.ds_mock.reset_mock()
class TestCreateDataSource(TestDataSources):
def setUp(self):
super(TestCreateDataSource, self).setUp()
self.ds_mock.create.return_value = api_ds.DataSources(
None, DS_INFO)
# Command to test
self.cmd = osc_ds.CreateDataSource(self.app, None)
def test_data_sources_create_no_options(self):
arglist = []
verifylist = []
self.assertRaises(osc_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
def test_data_sources_create_required_options(self):
arglist = ['source', '--type', 'swift', '--url',
'swift://container.sahara/object']
verifylist = [('name', 'source'), ('type', 'swift'),
('url', 'swift://container.sahara/object')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that data source was created with correct arguments
called_args = {'credential_pass': None, 'credential_user': None,
'data_source_type': 'swift', 'name': 'source',
'description': '',
'url': 'swift://container.sahara/object'}
self.ds_mock.create.assert_called_once_with(**called_args)
# Check that columns are correct
expected_columns = ('Description', 'Id', 'Name', 'Type', 'Url')
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = ('Data Source for tests', 'id', 'source', 'swift',
'swift://container.sahara/object')
self.assertEqual(expected_data, data)
def test_data_sources_create_all_options(self):
arglist = ['source', '--type', 'swift', '--url',
'swift://container.sahara/object', '--username', 'user',
'--password', 'pass', '--description',
'Data Source for tests']
verifylist = [('name', 'source'), ('type', 'swift'),
('url', 'swift://container.sahara/object'),
('username', 'user'), ('password', 'pass'),
('description', 'Data Source for tests')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that data source was created with correct arguments
called_args = {'credential_pass': 'pass', 'credential_user': 'user',
'data_source_type': 'swift', 'name': 'source',
'description': 'Data Source for tests',
'url': 'swift://container.sahara/object'}
self.ds_mock.create.assert_called_once_with(**called_args)
# Check that columns are correct
expected_columns = ('Description', 'Id', 'Name', 'Type', 'Url')
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = ('Data Source for tests', 'id', 'source', 'swift',
'swift://container.sahara/object')
self.assertEqual(expected_data, data)
class TestListDataSources(TestDataSources):
def setUp(self):
super(TestListDataSources, self).setUp()
self.ds_mock.list.return_value = [api_ds.DataSources(
None, DS_INFO)]
# Command to test
self.cmd = osc_ds.ListDataSources(self.app, None)
def test_data_sources_list_no_options(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that columns are correct
expected_columns = ['Name', 'Id', 'Type']
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = [('source', 'id', 'swift')]
self.assertEqual(expected_data, list(data))
def test_data_sources_list_long(self):
arglist = ['--long']
verifylist = [('long', True)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that columns are correct
expected_columns = ['Name', 'Id', 'Type', 'Url', 'Description']
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = [('source', 'id', 'swift',
'swift://container.sahara/object',
'Data Source for tests')]
self.assertEqual(expected_data, list(data))
class TestShowDataSource(TestDataSources):
def setUp(self):
super(TestShowDataSource, self).setUp()
self.ds_mock.get.return_value = api_ds.DataSources(
None, DS_INFO)
# Command to test
self.cmd = osc_ds.ShowDataSource(self.app, None)
def test_data_sources_show(self):
arglist = ['source']
verifylist = [('data_source', 'source')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
# Check that correct arguments was passed
self.ds_mock.get.assert_called_once_with('source')
# Check that columns are correct
expected_columns = ('Description', 'Id', 'Name', 'Type', 'Url')
self.assertEqual(expected_columns, columns)
# Check that data is correct
expected_data = ['Data Source for tests', 'id', 'source', 'swift',
'swift://container.sahara/object']
self.assertEqual(expected_data, list(data))
class TestDeleteDataSource(TestDataSources):
def setUp(self):
super(TestDeleteDataSource, self).setUp()
self.ds_mock.get.return_value = api_ds.DataSources(
None, DS_INFO)
# Command to test
self.cmd = osc_ds.DeleteDataSource(self.app, None)
def test_data_sources_delete(self):
arglist = ['source']
verifylist = [('data_source', 'source')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
# Check that correct arguments was passed
self.ds_mock.delete.assert_called_once_with('id')

View File

@ -40,6 +40,12 @@ openstack.data_processing.v1 =
dataprocessing_plugin_show = saharaclient.osc.v1.plugins:ShowPlugin
dataprocessing_plugin_configs_get = saharaclient.osc.v1.plugins:GetPluginConfigs
dataprocessing_data_source_create = saharaclient.osc.v1.data_sources:CreateDataSource
dataprocessing_data_source_list = saharaclient.osc.v1.data_sources:ListDataSources
dataprocessing_data_source_show = saharaclient.osc.v1.data_sources:ShowDataSource
dataprocessing_data_source_update = saharaclient.osc.v1.data_sources:UpdateDataSource
dataprocessing_data_source_delete = saharaclient.osc.v1.data_sources:DeleteDataSource
[build_sphinx]
all_files = 1
build-dir = doc/build