diff --git a/doc/source/contributor/plugins.rst b/doc/source/contributor/plugins.rst index beebb0310..2f0b7276a 100644 --- a/doc/source/contributor/plugins.rst +++ b/doc/source/contributor/plugins.rst @@ -40,6 +40,7 @@ The following is a list of projects that are an OpenStackClient plugin. - python-watcherclient - python-zaqarclient - python-zunclient +- python-draasclient \*\* Project contains advanced network services. diff --git a/openstackclient/draas/__init__.py b/openstackclient/draas/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/openstackclient/draas/client.py b/openstackclient/draas/client.py new file mode 100644 index 000000000..1b17616e4 --- /dev/null +++ b/openstackclient/draas/client.py @@ -0,0 +1,28 @@ +import logging +from osc_lib import utils + +from openstackclient.i18n import _ + +LOG = logging.getLogger(__name__) + +DEFAULT_API_VERSION = '1' +API_VERSION_OPTION = 'os_draas_api_version' +API_NAME = 'failover_group' +API_VERSIONS = { + '1': 'openstackclient.draas.v1.client.Client', +} + +def make_client(instance): + """Returns a draas service client.""" + LOG.debug('Draas client initialized using OpenStack SDK: %s', instance.sdk_connection.draas) + return instance.sdk_connection.draas + +def build_option_parser(parser): + """Hook to add global options""" + parser.add_argument( + '--os-draas-api-version', + metavar='', + default=utils.env('OS_DRAAS_API_VERSION', default=DEFAULT_API_VERSION), + help=_("Draas API version, default=%s (Env: OS_DRAAS_API_VERSION)") % DEFAULT_API_VERSION, + ) + return parser diff --git a/openstackclient/draas/v1/client.py b/openstackclient/draas/v1/client.py new file mode 100644 index 000000000..feb5d7e04 --- /dev/null +++ b/openstackclient/draas/v1/client.py @@ -0,0 +1,7 @@ +class Client: + def __init__(self, session): + self.session = session + + def resources(self): + # Implement the logic to list draas resources + return [] \ No newline at end of file diff --git a/openstackclient/draas/v1/failover_group.py b/openstackclient/draas/v1/failover_group.py new file mode 100644 index 000000000..b164e1197 --- /dev/null +++ b/openstackclient/draas/v1/failover_group.py @@ -0,0 +1,206 @@ + +"""DRaaS v1 Failover Group action implementations""" + +import logging + +from openstack import utils as sdk_utils +from osc_lib.cli import format_columns +from osc_lib.cli import parseractions +from osc_lib.command import command +from osc_lib import exceptions +from osc_lib import utils + +from openstackclient.common import pagination +from openstackclient.i18n import _ + +LOG = logging.getLogger(__name__) + + +_formatters = { + 'member_ids': format_columns.ListColumn, + 'boot_order': format_columns.ListColumn, +} + + +def _get_failover_group_columns(item, client): + column_map = {'member_ids': 'members', 'boot_order': 'boot order'} + hidden_columns = ['metadata', 'location'] + + return utils.get_osc_show_columns_for_sdk_resource( + item, column_map, hidden_columns + ) + + +class CreateFailoverGroup(command.ShowOne): + _description = _("Create a new failover group.") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'name', + metavar='', + help=_("New failover group name"), + ) + parser.add_argument( + 'description', + metavar='', + help=_("New failover group description"), + ) + return parser + + def take_action(self, parsed_args): + draas_client = self.app.client_manager.sdk_connection.draas + + kwargs = { + 'name': parsed_args.name, + 'description': parsed_args.description, + } + + failover_group = draas_client.create_failover_group(**kwargs) + + display_columns, columns = _get_failover_group_columns( + failover_group, + draas_client, + ) + data = utils.get_item_properties( + failover_group, + columns, + formatters=_formatters, + ) + return display_columns, data + + +class DeleteFailoverGroup(command.Command): + _description = _("Delete existing failover group(s).") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'failover_group', + metavar='', + nargs='+', + help=_("failover group(s) to delete (name or ID)"), + ) + return parser + + def take_action(self, parsed_args): + draas_client = self.app.client_manager.sdk_connection.draas + result = 0 + for group in parsed_args.failover_group: + try: + group_obj = draas_client.find_failover_group( + group, ignore_missing=False + ) + draas_client.delete_failover_group(group_obj.id) + # Catch all exceptions in order to avoid to block the next deleting + except Exception as e: + result += 1 + LOG.error(e) + + if result > 0: + total = len(parsed_args.failover_group) + msg = _("%(result)s of %(total)s failover groups failed to delete.") + raise exceptions.CommandError( + msg % {"result": result, "total": total} + ) + + +class ListFailoverGroup(command.Lister): + _description = _("List all failover groups.") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + '--all-projects', + action='store_true', + default=False, + help=_("Display information from all projects (admin only)"), + ) + parser.add_argument( + '--long', + action='store_true', + default=False, + help=_("List additional fields in output"), + ) + # TODO(stephenfin): This should really be a --marker option, but alas + # the API doesn't support that for some reason + pagination.add_offset_pagination_option_to_parser(parser) + return parser + + def take_action(self, parsed_args): + draas_client = self.app.client_manager.sdk_connection.draas + + kwargs = {} + + if parsed_args.all_projects: + kwargs['all_projects'] = parsed_args.all_projects + + if parsed_args.offset: + kwargs['offset'] = parsed_args.offset + + if parsed_args.limit: + kwargs['limit'] = parsed_args.limit + + data = draas_client.failover_groups(**kwargs) + + columns = ( + 'id', + 'name', + 'description', + ) + column_headers = ( + 'ID', + 'description', + ) + if parsed_args.long: + columns += ( + 'member_ids', + 'boot_order', + 'project_id', + 'user_id', + ) + column_headers += ( + 'Members', + 'Boot Order', + 'Project Id', + 'User Id', + ) + + return ( + column_headers, + ( + utils.get_item_properties( + s, + columns, + formatters=_formatters, + ) + for s in data + ), + ) + + +class ShowFailoverGroup(command.ShowOne): + _description = _("Display failover group details.") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + 'failover_group', + metavar='', + help=_("failover group to display (name or ID)"), + ) + return parser + + def take_action(self, parsed_args): + draas_client = self.app.client_manager.sdk_connection.draas + group = draas_client.find_draas_group( + parsed_args.draas_group, ignore_missing=False + ) + display_columns, columns = _get_draas_group_columns( + group, + draas_client, + ) + data = utils.get_item_properties( + group, columns, formatters=_formatters + ) + return display_columns, data diff --git a/openstackclient/draas/v1/resource.py b/openstackclient/draas/v1/resource.py new file mode 100644 index 000000000..cc6df909b --- /dev/null +++ b/openstackclient/draas/v1/resource.py @@ -0,0 +1,15 @@ +from osc_lib.command import command +from osc_lib import utils + +class ListResource(command.Lister): + _description = _("List draas resources") + + def get_parser(self, prog_name): + parser = super(ListResource, self).get_parser(prog_name) + return parser + + def take_action(self, parsed_args): + draas_client = self.app.client_manager.draas + data = draas_client.resources() + columns = ('ID', 'Name', 'Status') + return (columns, (utils.get_item_properties(s, columns) for s in data)) \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 0ce65134f..471dc191e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,6 +39,7 @@ openstack.cli.base = network = openstackclient.network.client object_store = openstackclient.object.client volume = openstackclient.volume.client + failover_group = openstackclient.draas.client openstack.common = availability_zone_list = openstackclient.common.availability_zone:ListAvailabilityZone @@ -863,3 +864,9 @@ openstack.volume.v3 = block_storage_cleanup = openstackclient.volume.v3.block_storage_cleanup:BlockStorageCleanup block_storage_volume_manageable_list = openstackclient.volume.v3.block_storage_manage:BlockStorageManageVolumes block_storage_snapshot_manageable_list = openstackclient.volume.v3.block_storage_manage:BlockStorageManageSnapshots + +openstack.failover_group.v1 = + failover_group_list = openstackclient.draas.v1.failover_group:ListFailoverGroup + failover_group_show = openstackclient.draas.v1.failover_group:ShowFailoverGroup + failover_group_create = openstackclient.draas.v1.failover_group:CreateFailoverGroup + failover_group_delete = openstackclient.draas.v1.failover_group:DeleteFailoverGroup