Adding Data Sources support to CLI
Adding Data Sources commands to Sahara OpenstackClient plugin: $ dataprocessing data sources list $ dataprocessing data sources show $ dataprocessing data sources create $ dataprocessing data sources delete Partially implements: blueprint cli-as-openstackclient-plugin Change-Id: I159c3067fd74463d7cca7fa781432b5438455b81
This commit is contained in:
parent
f0a3abeecf
commit
95e29fd929
179
saharaclient/osc/v1/data_sources.py
Normal file
179
saharaclient/osc/v1/data_sources.py
Normal 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)
|
201
saharaclient/tests/unit/osc/v1/test_data_sources.py
Normal file
201
saharaclient/tests/unit/osc/v1/test_data_sources.py
Normal 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')
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user