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_show = saharaclient.osc.v1.plugins:ShowPlugin
|
||||||
dataprocessing_plugin_configs_get = saharaclient.osc.v1.plugins:GetPluginConfigs
|
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]
|
[build_sphinx]
|
||||||
all_files = 1
|
all_files = 1
|
||||||
build-dir = doc/build
|
build-dir = doc/build
|
||||||
|
Loading…
Reference in New Issue
Block a user