Add set action to network groups CLI v1

Example:
    fuel network-group --set --network 1 --name new_name

Change-Id: I9335e23465ebd05a99929e0de6d110d6ff64c014
Closes-Bug: #1480259
This commit is contained in:
Alexander Saprykin 2015-08-04 11:30:32 +03:00
parent ec5c02b384
commit 3033de90af
3 changed files with 70 additions and 11 deletions

View File

@ -17,6 +17,7 @@ from fuelclient.cli.actions.base import check_all
import fuelclient.cli.arguments as Args
from fuelclient.cli.arguments import group
from fuelclient.cli.formatting import format_table
from fuelclient.commands.network_group import get_args_for_update
from fuelclient.objects.network_group import NetworkGroup
from fuelclient.objects.network_group import NetworkGroupCollection
@ -47,13 +48,15 @@ class NetworkGroupAction(Action):
" node group."
),
Args.get_delete_arg("Delete specified network groups."),
Args.get_list_arg("List all network groups.")
Args.get_list_arg("List all network groups."),
Args.get_set_arg("Set network group parameters.")
)
)
self.flag_func_map = (
("create", self.create),
("delete", self.delete),
(None, self.list)
("set", self.set),
(None, self.list),
)
@check_all('nodegroup', 'name', 'cidr')
@ -98,6 +101,29 @@ class NetworkGroupAction(Action):
','.join(params.network))
)
@check_all('network')
def set(self, params):
"""Set parameters for the specified network group:
fuel network-group --set --network 1 --name new_name
"""
# Since network has set type and we cannot update multiple network
# groups at once, we pick first network group id from set.
ng_id = next(iter(params.network))
if len(params.network) > 1:
msg = ("Warning: Only first network with id={0}"
" will be updated.".format(ng_id))
self.serializer.print_to_output({}, msg)
ng = NetworkGroup(ng_id)
update_params = get_args_for_update(params, self.serializer)
data = ng.set(update_params)
self.serializer.print_to_output(
data,
"Network group id={0} has been updated".format(ng_id))
def list(self, params):
"""To list all available network groups:
fuel network-group list

View File

@ -19,6 +19,24 @@ from fuelclient.commands import base
from fuelclient.common import data_utils
_updatable_keys = (
'name', 'vlan', 'cidr', 'gateway', 'group_id', 'meta')
def get_args_for_update(params, serializer=None):
result = {}
for attr in _updatable_keys:
value = getattr(params, attr, None)
if value is not None:
result[attr] = value
if 'meta' in result:
serializer = serializer or Serializer.from_params(params)
result['meta'] = serializer.deserialize(result['meta'])
return result
class NetworkGroupMixin(object):
entity_name = 'network-group'
@ -143,15 +161,7 @@ class NetworkGroupUpdate(NetworkGroupMixin, base.BaseShowCommand):
return parser
def take_action(self, parsed_args):
to_update = {}
for attr in self.client.updatable_attributes:
value = getattr(parsed_args, attr, None)
if value is not None:
to_update[attr] = value
if 'meta' in to_update:
serializer = Serializer.from_params(parsed_args)
to_update['meta'] = serializer.deserialize(to_update['meta'])
to_update = get_args_for_update(parsed_args)
network_group = self.client.update(parsed_args.id, **to_update)
network_group = data_utils.get_display_data_single(

View File

@ -112,3 +112,26 @@ class TestNetworkGroupActions(base.UnitTestCase):
self.assertIn("409 Client Error", m_stderr.write.call_args[0][0])
self.assertEqual(mreq.last_request.method, 'POST')
self.assertEqual(mreq.last_request.path, self.req_base_path)
def test_set_network_group(self, mreq):
path = self.req_base_path + str(self.env_id) + '/'
mreq.put(path)
self.execute([
'fuel', 'network-group', '--set', '--network', '42',
'--name', 'new name'])
self.assertEqual(mreq.last_request.method, 'PUT')
self.assertEqual(mreq.last_request.path, path)
def test_set_network_group_meta(self, mreq):
path = self.req_base_path + str(self.env_id) + '/'
mreq.put(path)
self.execute([
'fuel', 'network-group', '--set', '--network', '42',
'--meta', '{"ip_ranges": ["10.0.0.2", "10.0.0.254"]}'])
self.assertEqual(mreq.last_request.method, 'PUT')
self.assertEqual(mreq.last_request.path, path)
meta = mreq.last_request.json()['meta']
self.assertEqual(meta['ip_ranges'], ["10.0.0.2", "10.0.0.254"])