diff --git a/docs/devref/cli_option_guideline.rst b/docs/devref/cli_option_guideline.rst index 72ea43d..f743cc8 100644 --- a/docs/devref/cli_option_guideline.rst +++ b/docs/devref/cli_option_guideline.rst @@ -54,22 +54,6 @@ Some API attributes take a dictionary. This means ``{"foo": {"key1": "val1", "key2": "val2"} }`` is passed in the API layer. -Options for list value ----------------------- - -Some attributes take a list. - -In this case, we usually use: - -* Define an option per element (Use a singular form as an option name) -* Allow to specify the option multiple times - -For Example, **port-create** has ``--security-group`` option. -``selvpc vrrp add XXXX --region ru-1 --region ru-2`` generates -``{"vlan_subnets": {"regions": ["SG1", "SG2"] ... }`` in the API layer. - -.. _background-nargs: - Avoid using nargs in positional or optional arguments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/usage/commands.rst b/docs/usage/commands.rst index 787d48b..a55850a 100644 --- a/docs/usage/commands.rst +++ b/docs/usage/commands.rst @@ -134,24 +134,6 @@ Manage subnets .. note:: By defaults: key **type** is **ipv4**, **prefix** is **29**, **quantity** is **1** -Manage VRRP subnets -~~~~~~~~~~~~~~~~~~~ -.. code-block:: console - - $ selvpc vrrp add --master ru-1 --slave ru-2 [--type VALUE] [--prefix VALUE] [--quantity VALUE] - $ selvpc vrrp list [--project XXX] [--detailed] - $ selvpc vrrp show - $ selvpc vrrp delete ... --yes-i-really-want-to-delete - -.. note:: - Key **detailed** appends additional column: *servers*. - -.. note:: - Key **region** is repeatable. - -.. note:: - By defaults: key **type** is **ipv4**, **prefix** is **29**, **quantity** is **1** - Manage tokens ~~~~~~~~~~~~~ .. code-block:: console diff --git a/docs/usage/library.rst b/docs/usage/library.rst index 63e586b..af60dec 100644 --- a/docs/usage/library.rst +++ b/docs/usage/library.rst @@ -160,13 +160,6 @@ Manage Subnets :members: :show-inheritance: -Manage VRRP Subnets -~~~~~~~~~~~~~~~~~~~ - -.. automodule:: selvpcclient.resources.vrrp - :members: - :show-inheritance: - Manage Floating IP ~~~~~~~~~~~~~~~~~~ diff --git a/selvpcclient/client.py b/selvpcclient/client.py index fbf662b..327f5eb 100644 --- a/selvpcclient/client.py +++ b/selvpcclient/client.py @@ -13,7 +13,6 @@ from selvpcclient.resources.subnets import SubnetManager from selvpcclient.resources.tokens import TokensManager from selvpcclient.resources.users import UsersManager -from selvpcclient.resources.vrrp import VRRPManager def setup_http_client(api_url, api_token=None, api_version=2, @@ -64,7 +63,6 @@ def __init__( self.roles = RolesManager(client) self.floatingips = FloatingIPManager(client) self.subnets = SubnetManager(client) - self.vrrp = VRRPManager(client) self.capabilities = CapabilitiesManager(client) self.tokens = TokensManager(client) self.customization = CustomizationManager(client) diff --git a/selvpcclient/commands/__init__.py b/selvpcclient/commands/__init__.py index 1e72148..b0ccc72 100644 --- a/selvpcclient/commands/__init__.py +++ b/selvpcclient/commands/__init__.py @@ -1,6 +1,6 @@ from selvpcclient.commands import (capabilities, customization, floatingips, license, limit, keypair, project, quotas, - role, subnet, token, user, vrrp) + role, subnet, token, user) commands = { 'capabilities show regions': capabilities.Regions, @@ -36,11 +36,6 @@ 'subnet show': subnet.Show, 'subnet delete': subnet.Delete, - 'vrrp add': vrrp.Add, - 'vrrp list': vrrp.List, - 'vrrp show': vrrp.Show, - 'vrrp delete': vrrp.Delete, - 'user create': user.Create, 'user update': user.Update, 'user list': user.List, diff --git a/selvpcclient/commands/vrrp.py b/selvpcclient/commands/vrrp.py deleted file mode 100644 index 7bb0190..0000000 --- a/selvpcclient/commands/vrrp.py +++ /dev/null @@ -1,140 +0,0 @@ -from selvpcclient.base import CLICommand, ListCommand -from selvpcclient.formatters import format_servers -from selvpcclient.util import (add_resource_filter_arguments, confirm_action, - handle_http_error) - - -class Add(ListCommand): - """Add new vrrp subnet into project""" - - columns = ['id', 'project_id', 'cidr', 'status'] - sorting_support = True - - def get_parser(self, prog_name): - parser = super(ListCommand, self).get_parser(prog_name) - required = parser.add_argument_group('Required arguments') - required.add_argument('project_id', - metavar='', - help='Project id' - ) - required.add_argument('-m', - '--master', - required=True, - action='store', - dest='master', - ) - required.add_argument('-s', - '--slave', - required=True, - action='store', - dest='slave', - ) - optional = parser.add_argument_group('Optional arguments') - optional.add_argument('--type', - default='ipv4', - ) - optional.add_argument('-p', - '--prefix', - type=int, - default=29, - ) - optional.add_argument('--quantity', - type=int, - default=1, - ) - return parser - - @handle_http_error - def take_action(self, parsed_args): - body = { - "vrrp_subnets": [ - { - "regions": { - "master": parsed_args.master, - "slave": parsed_args.slave - }, - "prefix_length": parsed_args.prefix, - "type": parsed_args.type, - "quantity": parsed_args.quantity, - } - ] - } - result = self.app.context["client"].vrrp.add( - parsed_args.project_id, body - ) - return self.setup_columns(result, parsed_args) - - -class Show(ListCommand): - """Show detailed vrrp subnet information""" - - columns = ['id', 'project_id', 'cidr', 'status', 'servers', - 'master_region', 'slave_region'] - _formatters = {"servers": format_servers} - - def get_parser(self, prog_name): - parser = super(ListCommand, self).get_parser(prog_name) - required = parser.add_argument_group('Required arguments') - required.add_argument('id', - metavar='', - help='Project VRRP subnet id' - ) - return parser - - @handle_http_error - def take_action(self, parsed_args): - result = self.app.context["client"].vrrp.show(parsed_args.id) - return self.setup_columns([result._info], parsed_args) - - -class Delete(CLICommand): - """Delete vrrp subnet from project""" - - def get_parser(self, prog_name): - parser = super(CLICommand, self).get_parser(prog_name) - required = parser.add_argument_group('Required arguments') - required.add_argument('id', - nargs='+', - metavar='', - help='Project VRRP subnet ids') - required.add_argument('--yes-i-really-want-to-delete', - default=False, - action='store_true', - ) - return parser - - @confirm_action("delete") - def take_action(self, parsed_args): - self.app.context["client"].vrrp.delete_many( - parsed_args.id, - raise_if_not_found=False - ) - - -class List(ListCommand): - """List of vrrp subnets""" - - columns = ['id', 'project_id', 'cidr', 'status', 'master_region', - 'slave_region'] - sorting_support = True - - def get_parser(self, prog_name): - parser = super(ListCommand, self).get_parser(prog_name) - optional = parser.add_argument_group('Optional arguments') - optional.add_argument('--detailed', - default=False, - action='store_true', - ) - add_resource_filter_arguments(parser, add_region=False) - return parser - - @handle_http_error - def take_action(self, parsed_args): - if parsed_args.detailed: - self.columns.append('servers') - self._formatters = {"servers": format_servers} - - result = self.app.context["client"].vrrp.list( - project_id=parsed_args.project_id, - ) - return self.setup_columns(result, parsed_args) diff --git a/selvpcclient/resources/vrrp.py b/selvpcclient/resources/vrrp.py deleted file mode 100644 index 87f5406..0000000 --- a/selvpcclient/resources/vrrp.py +++ /dev/null @@ -1,93 +0,0 @@ -import logging - -from selvpcclient import base -from selvpcclient.util import resource_filter -from selvpcclient.exceptions.base import ClientException - -log = logging.getLogger(__name__) - - -class VRRP(base.Resource): - """Represents a vrrp.""" - - def delete(self): - """Delete current vrrp subnet from domain.""" - self.manager.delete(self.id) - - -class VRRPManager(base.Manager): - """Manager class for manipulating vrrp subnets.""" - resource_class = VRRP - - @resource_filter - def list(self, return_raw=False): - """Get list of all vrrp in current domain. - - :param return_raw: flag to force returning raw JSON instead of - Python object of self.resource_class - :rtype: list of :class:`VRRP` - """ - return self._list('/vrrp_subnets', 'vrrp_subnets', - return_raw=return_raw) - - def add(self, project_id, vrrp, return_raw=False): - """Create vrrp in project. - - :param string project_id: Project id. - :param dict vrrp: Dict with key `vrrp` and value as array - of items region and quantity:: - - { - "vrrp_subnets": [ - { - "regions": [ - "master": "ru-1", - "slave": "ru-2" - ], - "quantity": 1, - "prefix_length": 29, - "type": "ipv4", - } - ] - } - :param return_raw: flag to force returning raw JSON instead of - Python object of self.resource_class - :rtype: list of :class:`VRRP` - """ - - url = '/vrrp_subnets/projects/{}'.format(project_id) - return self._list(url, 'vrrp_subnets', body=vrrp, - return_raw=return_raw) - - def show(self, vrrp_id, return_raw=False): - """Show detailed vrrp information. - - :param string vrrp_id: VRRP id. - :param return_raw: flag to force returning raw JSON instead of - Python object of self.resource_class - :rtype: :class:`VRRP` - """ - return self._get('/vrrp_subnets/{}'.format(vrrp_id), 'vrrp_subnet', - return_raw=return_raw) - - def delete(self, vrrp_id): - """Delete vrrp from domain. - - :param string vrrp_id: VRRP id. - """ - self._delete('/vrrp_subnets/{}'.format(vrrp_id)) - - def delete_many(self, vrrp_ids, raise_if_not_found=True): - """Delete few vrrp subnets from domain. - - :param list vrrp_ids: VRRP subnet id's list - :param bool raise_if_not_found: Raise exception if object won't found - """ - for vrrp_id in vrrp_ids: - try: - self.delete(vrrp_id) - log.info("VRRP subnet %s has been deleted", vrrp_id) - except ClientException as err: - if raise_if_not_found: - raise err - log.error("%s %s", err, vrrp_id) diff --git a/tests/cli/test_vrrp.py b/tests/cli/test_vrrp.py deleted file mode 100644 index 85d0dfb..0000000 --- a/tests/cli/test_vrrp.py +++ /dev/null @@ -1,71 +0,0 @@ -import pytest - -from tests.cli import make_client, run_cmd -from tests.util import answers - - -def test_vrrp_add(): - client = make_client(return_value=answers.VRRP_ADD) - args = ['vrrp add', - 'a2e6dd715ca24681b9b335d247b83d16', - '--master', 'ru-1', - '--slave', 'ru-2', - '--type', 'ipv4', - '--prefix', '29', - '--quantity', '3'] - - output = run_cmd(args, client, json_output=True) - - assert output[0]["id"] == 6 - assert output[0]["project_id"] == 'b63ab68796e34858befb8fa2a8b1e12a' - - -def test_vrrp_show(): - client = make_client(return_value=answers.VRRP_SHOW) - args = ['vrrp show', '2'] - - output = run_cmd(args, client, json_output=True) - - assert output[0]["id"] == 2 - assert output[0]["project_id"] == 'b63ab68796e34858befb8fa2a8b1e12a' - - -def test_vrrp_delete_without_accept(): - client = make_client(return_value=None) - args = ['vrrp delete', '2'] - - with pytest.raises(SystemExit): - run_cmd(args, client) - - -def test_vrrp_list(): - client = make_client(return_value=answers.VRRP_LIST) - args = ['vrrp list'] - - output = run_cmd(args, client, json_output=True) - - assert len(output) == 2 - - -def test_vrrp_list_with_filters(): - client = make_client(return_value=answers.VRRP_LIST) - - args = ['vrrp list', "--project", "x63ab68796e34858befb8fa2a8b1e12a"] - output = run_cmd(args, client, json_output=True) - assert len(output) == 1 - assert output[0]["project_id"] == 'x63ab68796e34858befb8fa2a8b1e12a' - - args = ['vrrp list', - "--project", "xxxxx68796e34858befb8fa2a8b1e12a"] - output = run_cmd(args, client, json_output=True) - assert len(output) == 0 - - -def test_vrrp_multiple_delete(): - client = make_client(return_value=None) - args = ["vrrp delete", - "--yes-i-really-want-to-delete", - "15c578ea47a5466db2aeb57dc8443676", - "1ec578ea47a5466db2aeb57dc8443672", - "16c578ea47a5466db2aeb57dc8443676"] - run_cmd(args, client) diff --git a/tests/rest/test_vrrp.py b/tests/rest/test_vrrp.py deleted file mode 100644 index 01ef1f8..0000000 --- a/tests/rest/test_vrrp.py +++ /dev/null @@ -1,108 +0,0 @@ -import pytest -import responses - -from selvpcclient.exceptions.base import ClientException -from selvpcclient.resources.vrrp import VRRPManager -from tests.rest import client -from tests.util import answers, params - - -@responses.activate -def test_list(): - responses.add(responses.GET, 'http://api/v2/vrrp_subnets', - json=answers.VRRP_LIST) - - manager = VRRPManager(client) - - subnets = manager.list() - assert len(subnets) == 2 - - -@responses.activate -def test_list_with_filters(): - responses.add(responses.GET, 'http://api/v2/vrrp_subnets', - json=answers.VRRP_LIST) - - manager = VRRPManager(client) - - ips = manager.list(project_id="x63ab68796e34858befb8fa2a8b1e12a") - assert len(ips) == 1 - assert ips[0]["project_id"] == "x63ab68796e34858befb8fa2a8b1e12a" - - ips = manager.list(project_id="e7081cb46966421fb8b3f3fd9b4db75b") - assert len(ips) == 0 - - -@responses.activate -def test_add(): - responses.add(responses.POST, 'http://api/v2/vrrp_subnets/projects/200', - json=answers.VRRP_ADD) - - manager = VRRPManager(client) - - subnets = manager.add(project_id=200, vrrp=params.vrrp) - - assert len(subnets) > 0 - - -@responses.activate -def test_show(): - responses.add(responses.GET, 'http://api/v2/vrrp_subnets/666', - json=answers.VRRP_SHOW) - - manager = VRRPManager(client) - - vrrp = manager.show(vrrp_id=666) - - assert vrrp is not None - - -@responses.activate -def test_delete(): - responses.add(responses.DELETE, 'http://api/v2/vrrp_subnets/456', - status=204) - - manager = VRRPManager(client) - - result = manager.delete(vrrp_id=456) - - assert result is None - - -@responses.activate -def test_delete_from_single_obj(): - responses.add(responses.GET, 'http://api/v2/vrrp_subnets', - json=answers.VRRP_LIST) - responses.add(responses.DELETE, 'http://api/v2/vrrp_subnets/3', - status=204) - - manager = VRRPManager(client) - - vrrp = manager.list()[0] - result = vrrp.delete() - - assert result is None - - -@responses.activate -def test_list_raw(): - responses.add(responses.GET, 'http://api/v2/vrrp_subnets', - json=answers.VRRP_LIST) - - manager = VRRPManager(client) - - subnets = manager.list(return_raw=True) - assert subnets == answers.VRRP_LIST["vrrp_subnets"] - - -@responses.activate -def test_delete_multiple_with_raise(): - responses.add(responses.DELETE, 'http://api/v2/vrrp_subnets/100', - status=204) - responses.add(responses.DELETE, 'http://api/v2/vrrp_subnets/200', - status=404) - - manager = VRRPManager(client) - - with pytest.raises(ClientException): - manager.delete_many(vrrp_ids=[100, 200]) diff --git a/tests/util/answers.py b/tests/util/answers.py index 64778f1..802d1be 100644 --- a/tests/util/answers.py +++ b/tests/util/answers.py @@ -330,13 +330,6 @@ "used": 0 } ], - "network_subnets_29_vrrp": [ - { - "used": 0, - "value": 0, - "zone": None - } - ], } } @@ -770,77 +763,6 @@ } } -VRRP_ADD = { - "vrrp_subnets": - [{ - "status": "DOWN", - "cidr": "78.155.195.8/29", - "project_id": "b63ab68796e34858befb8fa2a8b1e12a", - "id": 6, - "subnets": [ - { - "network_id": "827fe85f-a379-4f28-a426-2ddf7ddab6a2", - "subnet_id": "6595e66c-b14e-4167-9a48-6be6fb407c63", - "region": "ru-1" - }, - { - "network_id": "68b6a3e0-d016-4248-b8de-03cb20cacb2c", - "subnet_id": "9e8cf4bb-a385-401d-bda4-395f3985ead1", - "region": "ru-2" - } - ], - }] -} - -VRRP_SHOW = { - "vrrp_subnet": { - "status": "DOWN", - "subnets": [ - { - "network_id": "1eb0e13d-0ce6-4c00-99e8-45e4787766fd", - "subnet_id": "053f7817-6804-4fad-8f6b-0d1edef074ed", - "region": "ru-1" - }, - { - "network_id": "74694b81-4203-4599-ae71-029182f9cef9", - "subnet_id": "cc1d50b9-4890-4173-a750-4537c1f747a2", - "region": "ru-2" - } - ], - "servers": [], - "cidr": "78.155.195.0/29", - "project_id": "b63ab68796e34858befb8fa2a8b1e12a", - "id": 2, - "master_region": "ru-1", - "slave_region": "ru-2" - } -} - -VRRP_LIST = { - "vrrp_subnets": [ - { - "status": "DOWN", - "subnets": [], - "servers": [], - "cidr": "78.155.196.0/29", - "project_id": "x63ab68796e34858befb8fa2a8b1e12a", - "id": 3, - "master_region": "ru-1", - "slave_region": "ru-2" - }, - { - "status": "DOWN", - "subnets": [], - "servers": [], - "cidr": "78.155.195.0/29", - "project_id": "b63ab68796e34858befb8fa2a8b1e12a", - "id": 2, - "master_region": "ru-1", - "slave_region": "ru-2" - } - ] -} - QUOTAS_PARTIAL = { "quotas": { "compute_ram": [ diff --git a/tests/util/params.py b/tests/util/params.py index 53273d2..47e490a 100644 --- a/tests/util/params.py +++ b/tests/util/params.py @@ -72,18 +72,6 @@ ] } -vrrp = { - "vrrp_subnet": { - "type": "ipv4", - "prefix_length": 29, - 'quantity': 3, - "regions": [ - "ru-1", - "ru-2" - ] - } -} - keypair = { "keypair": { "user_id": "b832ef...94469d",