Environments fuel2 command refactored

Standard cliff formatters used.
Environments operations refactored to use TuningBox
errors on object not found error.

Change-Id: I2bf66ec8169fd72dc4abd70ebc56501a58923e8e
Closes-Bug: #1616867
This commit is contained in:
Alexander Kislitsky 2016-08-25 02:16:01 +03:00
parent fe297395cc
commit 5502205a27
6 changed files with 70 additions and 113 deletions

View File

@ -106,11 +106,11 @@ class BaseOneCommand(BaseCommand):
return '{0}/{1}'.format(self.base_url, parsed_args.id)
def get_deletion_message(self, parsed_args):
return '{0} with id {1} was deleted'.format(
return '{0} with id {1} was deleted\n'.format(
self.entity_name.capitalize(), parsed_args.id)
def get_update_message(self, parsed_args):
return '{0} with id {1} was updated'.format(
return '{0} with id {1} was updated\n'.format(
self.entity_name.capitalize(), parsed_args.id)

View File

@ -10,25 +10,37 @@
# License for the specific language governing permissions and limitations
# under the License.
from cliff import show
import six
from tuning_box.cli import base
from tuning_box.cli.base import BaseCommand
class ListEnvironments(base.FormattedCommand, BaseCommand):
def take_action(self, parsed_args):
return self.get_client().get('/environments')
class EnvironmentsCommand(base.BaseCommand):
entity_name = 'environment'
base_url = '/environments'
columns = ('id', 'components', 'hierarchy_levels')
class CreateEnvironment(base.FormattedCommand, BaseCommand):
class ListEnvironments(EnvironmentsCommand, base.BaseListCommand):
pass
class ShowEnvironment(EnvironmentsCommand, base.BaseShowCommand):
pass
class DeleteEnvironment(EnvironmentsCommand, base.BaseDeleteCommand):
pass
class CreateEnvironment(EnvironmentsCommand, show.ShowOne):
def get_parser(self, *args, **kwargs):
parser = super(CreateEnvironment, self).get_parser(
*args, **kwargs)
parser.add_argument(
'-c', '--components',
'-i', '--components',
type=str,
help="Comma separated components IDs",
)
@ -44,42 +56,21 @@ class CreateEnvironment(base.FormattedCommand, BaseCommand):
parsed_args, 'levels', six.text_type)
components = self._parse_comma_separated(
parsed_args, 'components', int)
res = self.get_client().post(
'/environments',
result = self.get_client().post(
self.base_url,
{'hierarchy_levels': levels, 'components': components}
)
return res
return zip(*result.items())
class EnvironmentCommand(base.FormattedCommand, BaseCommand):
def get_parser(self, *args, **kwargs):
parser = super(EnvironmentCommand, self).get_parser(*args, **kwargs)
parser.add_argument('id', type=int, help='Id of the environment')
return parser
class ShowEnvironment(EnvironmentCommand):
def take_action(self, parsed_args):
return self.get_client().get('/environments/{0}'.format(
parsed_args.id))
class DeleteEnvironment(EnvironmentCommand):
def take_action(self, parsed_args):
return self.get_client().delete('/environments/{0}'.format(
parsed_args.id))
class UpdateEnvironment(EnvironmentCommand):
class UpdateEnvironment(EnvironmentsCommand, base.BaseOneCommand):
def get_parser(self, *args, **kwargs):
parser = super(UpdateEnvironment, self).get_parser(
*args, **kwargs)
parser.add_argument(
'-c', '--components',
'-i', '--components',
dest='components',
type=str,
help="Comma separated components IDs. "
@ -103,7 +94,7 @@ class UpdateEnvironment(EnvironmentCommand):
data['components'] = self._parse_comma_separated(
parsed_args, 'components', int)
return self.get_client().patch(
'/environments/{0}'.format(parsed_args.id),
data
)
result = self.get_client().patch(self.get_url(parsed_args), data)
if result is None:
result = self.get_update_message(parsed_args)
self.app.stdout.write(six.text_type(result))

View File

@ -80,7 +80,7 @@ class Environment(flask_restful.Resource):
method_decorators = [flask_restful.marshal_with(environment_fields)]
def get(self, environment_id):
env = db.Environment.query.get_or_404(environment_id)
env = db.get_or_404(db.Environment, environment_id)
hierarchy_levels = db.EnvironmentHierarchyLevel.\
get_for_environment(env)
# Proper order of levels can't be provided by ORM backref
@ -120,7 +120,7 @@ class Environment(flask_restful.Resource):
@db.with_transaction
def _perform_update(self, environment_id):
environment = db.Environment.query.get_or_404(environment_id)
environment = db.get_or_404(db.Environment, environment_id)
update_by = flask.request.json
components = update_by.get('components')
@ -138,6 +138,6 @@ class Environment(flask_restful.Resource):
@db.with_transaction
def delete(self, environment_id):
environment = db.Environment.query.get_or_404(environment_id)
environment = db.get_or_404(db.Environment, environment_id)
db.db.session.delete(environment)
return None, 204

View File

@ -94,7 +94,7 @@ class TestDeleteComponent(testscenarios.WithScenarios, _BaseCLITest):
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('', ('/components/9', 'comp delete 9',
'Component with id 9 was deleted')),
'Component with id 9 was deleted\n')),
]
]
mock_url = None

View File

@ -20,32 +20,18 @@ class TestCreateEnvironment(testscenarios.WithScenarios, _BaseCLITest):
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('json', ('/environments',
'env create --levels lvl1 --components 1 --format json',
'{}')),
'env create -l lvl1 -i 1 -f json',
'{\n "a": "b"\n}')),
('yaml', ('/environments',
'env create --levels lvl1,lvl2 --components 1 '
'--format yaml',
'{}\n')),
('plain', ('/environments',
'env create --levels lvl1,lvl2 --components 1,2,3 '
'--format plain',
'{}')),
('plain', ('/environments',
'env create '
'--format plain',
'{}')),
('json', ('/environments',
'env create -l lvl1 -c 1 -f json',
'{}')),
('yaml', ('/environments',
'env create -l lvl1,lvl2 -c 1 -f yaml',
'{}\n')),
('plain', ('/environments',
'env create -l lvl1,lvl2 -c 1,2,3 -f plain',
'{}')),
('plain', ('/environments',
'env create -f plain',
'{}'))
'env create -l lvl1,lvl2 -i 1 -f yaml',
'a: b\n')),
('multi', ('/environments',
'env create -l lvl1,lvl2 -i 1,2,3 -f yaml',
'a: b\n')),
('no_data', ('/environments',
'env create -f yaml',
'a: b\n'))
]
]
@ -57,7 +43,7 @@ class TestCreateEnvironment(testscenarios.WithScenarios, _BaseCLITest):
self.req_mock.post(
self.BASE_URL + self.mock_url,
headers={'Content-Type': 'application/json'},
json={},
json={'a': 'b'},
)
self.cli.run(self.args.split())
self.assertEqual(self.expected_result, self.cli.stdout.getvalue())
@ -68,9 +54,8 @@ class TestListEnvironments(testscenarios.WithScenarios, _BaseCLITest):
scenarios = [
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('json', ('/environments', 'env list', '{}')),
('yaml', ('/environments', 'env list --format yaml', '{}\n')),
('plain', ('/environments', 'env list --format plain', '{}'))
('json', ('/environments', 'env list -f json', '[]')),
('yaml', ('/environments', 'env list -f yaml', '[]\n'))
]
]
mock_url = None
@ -92,9 +77,9 @@ class TestShowEnvironment(testscenarios.WithScenarios, _BaseCLITest):
scenarios = [
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('json', ('/environments/9', 'env show 9 --format json', '{}')),
('yaml', ('/environments/9', 'env show 9 --format yaml', '{}\n')),
('plain', ('/environments/9', 'env show 9 --format plain', '{}'))
('json', ('/environments/9', 'env show 9 -f json',
'{\n "id": 1\n}')),
('yaml', ('/environments/9', 'env show 9 -f yaml', 'id: 1\n'))
]
]
mock_url = None
@ -105,7 +90,7 @@ class TestShowEnvironment(testscenarios.WithScenarios, _BaseCLITest):
self.req_mock.get(
self.BASE_URL + self.mock_url,
headers={'Content-Type': 'application/json'},
json={},
json={'id': 1},
)
self.cli.run(self.args.split())
self.assertEqual(self.expected_result, self.cli.stdout.getvalue())
@ -116,12 +101,8 @@ class TestDeleteEnvironment(testscenarios.WithScenarios, _BaseCLITest):
scenarios = [
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('json', ('/environments/9', 'env delete 9 --format json',
'{}')),
('yaml', ('/environments/9', 'env delete 9 --format yaml',
'{}\n')),
('plain', ('/environments/9', 'env delete 9 --format plain',
'{}'))
('json', ('/environments/9', 'env delete 9',
'Environment with id 9 was deleted\n'))
]
]
mock_url = None
@ -131,8 +112,7 @@ class TestDeleteEnvironment(testscenarios.WithScenarios, _BaseCLITest):
def test_delete(self):
self.req_mock.delete(
self.BASE_URL + self.mock_url,
headers={'Content-Type': 'application/json'},
json={}
headers={'Content-Type': 'application/json'}
)
self.cli.run(self.args.split())
self.assertEqual(self.expected_result, self.cli.stdout.getvalue())
@ -143,33 +123,19 @@ class TestUpdateEnvironment(testscenarios.WithScenarios, _BaseCLITest):
scenarios = [
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('json', ('/environments/9',
'env update 9 -f json',
'{}')),
('json', ('/environments/9',
'env update 9 -l lvl1 -f json',
'{}')),
('yaml', ('/environments/9',
'env update 9 -l lvl1,lvl2 -f yaml',
'{}\n')),
('plain', ('/environments/9',
'env update 9 -l lvl1,lvl2 -c 1 -f plain',
'{}')),
('json', ('/environments/9',
'env update 9 -l lvl1,lvl2 -c 1,2 -f json',
'{}')),
('json', ('/environments/9',
'env update 9 -l [] -c 1,2 -f json',
'{}')),
('json', ('/environments/9',
'env update 9 -l [] -c [] -f json',
'{}')),
('json', ('/environments/9',
'env update 9 --levels [] --components [] --format json',
'{}')),
('json', ('/environments/9',
'env update 9 --levels a,b --components 1,2',
'{}')),
('no_data', ('/environments/9', 'env update 9', '{}')),
('level', ('/environments/9', 'env update 9 -l lvl1', '{}')),
('levels', ('/environments/9',
'env update 9 -l lvl1,lvl2',
'{}')),
('component', ('/environments/9',
'env update 9 -l lvl1,lvl2 -i 1',
'{}')),
('components', ('/environments/9',
'env update 9 -l lvl1,lvl2 -i 1,2',
'{}')),
('erase', ('/environments/9', 'env update 9 -l [] -i 1,2', '{}')),
('erase', ('/environments/9', 'env update 9 -l [] -i []', '{}')),
]
]
mock_url = None

View File

@ -104,7 +104,7 @@ class TestDeleteComponent(testscenarios.WithScenarios, _BaseCLITest):
(s[0], dict(zip(('mock_url', 'args', 'expected_result'), s[1])))
for s in [
('', ('/resource_definitions/9', 'def delete 9',
'Resource_definition with id 9 was deleted')),
'Resource_definition with id 9 was deleted\n')),
]
]
mock_url = None