diff options
Diffstat (limited to 'designateclient/v2')
| -rw-r--r-- | designateclient/v2/cli/zones.py | 133 | ||||
| -rw-r--r-- | designateclient/v2/client.py | 2 | ||||
| -rw-r--r-- | designateclient/v2/zones.py | 36 |
3 files changed, 168 insertions, 3 deletions
diff --git a/designateclient/v2/cli/zones.py b/designateclient/v2/cli/zones.py index f326232..24f64de 100644 --- a/designateclient/v2/cli/zones.py +++ b/designateclient/v2/cli/zones.py @@ -241,6 +241,10 @@ class DeleteZoneCommand(command.ShowOne): parser.add_argument('id', help="Zone ID") + parser.add_argument('--delete-shares', default=False, + action='store_true', + help='Delete existing zone shares. Default: False') + common.add_all_common_options(parser) common.add_hard_delete_option(parser) @@ -250,7 +254,13 @@ class DeleteZoneCommand(command.ShowOne): client = self.app.client_manager.dns common.set_all_common_headers(client, parsed_args) - data = client.zones.delete(parsed_args.id) + delete_shares = False + if (hasattr(parsed_args, 'delete_shares') and + parsed_args.delete_shares is not None and + isinstance(parsed_args.delete_shares, bool)): + delete_shares = parsed_args.delete_shares + + data = client.zones.delete(parsed_args.id, delete_shares=delete_shares) LOG.info('Zone %s was deleted', parsed_args.id) _format_zone(data) @@ -724,3 +734,124 @@ class DeleteZoneImportCommand(command.Command): client.zone_imports.delete(parsed_args.zone_import_id) LOG.info('Zone Import %s was deleted', parsed_args.zone_import_id) + + +class ShareZoneCommand(command.ShowOne): + """Share a Zone""" + + def get_parser(self, prog_name): + parser = super(ShareZoneCommand, self).get_parser( + prog_name) + + common.add_all_common_options(parser) + + parser.add_argument('zone', help='The zone name or ID to share.') + parser.add_argument('target_project_id', + help='Target project ID to share the zone with.') + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + data = client.zone_share.create( + parsed_args.zone, + parsed_args.target_project_id + ) + + LOG.info('Zone %s was shared', data['id']) + + data.pop('links', None) + + return self.dict2columns(data) + + +class ListSharedZonesCommand(command.Lister): + """List Zone Shares""" + + columns = [ + 'id', + 'zone_id', + 'target_project_id', + ] + + def get_parser(self, prog_name): + parser = super(ListSharedZonesCommand, self).get_parser( + prog_name) + + common.add_all_common_options(parser) + + parser.add_argument('zone', help='The zone name or ID to share.') + + parser.add_argument('--target-project-id', + help='The target project ID to filter on.', + required=False) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + criterion = {} + if parsed_args.target_project_id is not None: + criterion['target_project_id'] = parsed_args.target_project_id + + data = get_all(client.zone_share.list, criterion=criterion, + args=[parsed_args.zone]) + + cols = list(self.columns) + + if client.session.all_projects: + cols.insert(1, 'project_id') + + return cols, (utils.get_item_properties(s, cols) for s in data) + + +class ShowSharedZoneCommand(command.ShowOne): + """Show Zone Share Details""" + + def get_parser(self, prog_name): + parser = super(ShowSharedZoneCommand, self).get_parser(prog_name) + + parser.add_argument('zone', help='The zone name or ID to share.') + parser.add_argument('shared_zone_id', + help='The zone share ID to show.') + + common.add_all_common_options(parser) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + data = client.zone_share.get(parsed_args.zone, + parsed_args.shared_zone_id) + data.pop('links', None) + + return self.dict2columns(data) + + +class DeleteSharedZoneCommand(command.Command): + """Delete a Zone Share""" + + def get_parser(self, prog_name): + parser = super(DeleteSharedZoneCommand, self).get_parser( + prog_name) + + parser.add_argument('zone', help='The zone name or ID to share.') + parser.add_argument('shared_zone_id', + help='The zone share ID to delete.') + + common.add_all_common_options(parser) + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + client.zone_share.delete(parsed_args.zone, parsed_args.shared_zone_id) + + LOG.info('Shared Zone %s was deleted', parsed_args.shared_zone_id) diff --git a/designateclient/v2/client.py b/designateclient/v2/client.py index 4463506..053275c 100644 --- a/designateclient/v2/client.py +++ b/designateclient/v2/client.py @@ -29,6 +29,7 @@ from designateclient.v2.tsigkeys import TSIGKeysController from designateclient.v2.zones import ZoneController from designateclient.v2.zones import ZoneExportsController from designateclient.v2.zones import ZoneImportsController +from designateclient.v2.zones import ZoneShareController from designateclient.v2.zones import ZoneTransfersController from designateclient import version from oslo_utils import importutils @@ -151,6 +152,7 @@ class Client(object): self.zone_transfers = ZoneTransfersController(self) self.zone_exports = ZoneExportsController(self) self.zone_imports = ZoneImportsController(self) + self.zone_share = ZoneShareController(self) self.pools = PoolController(self) self.quotas = QuotasController(self) self.tsigkeys = TSIGKeysController(self) diff --git a/designateclient/v2/zones.py b/designateclient/v2/zones.py index 7e862a7..209d4f0 100644 --- a/designateclient/v2/zones.py +++ b/designateclient/v2/zones.py @@ -62,12 +62,18 @@ class ZoneController(V2Controller): return self._patch(url, data=values) - def delete(self, zone): + def delete(self, zone, delete_shares=False): zone = v2_utils.resolve_by_name(self.list, zone) url = self.build_url('/zones/%s' % zone) - return self._delete(url) + if delete_shares: + headers = {'X-Designate-Delete-Shares': 'true'} + _resp, body = self.client.session.delete(url, headers=headers) + else: + _resp, body = self.client.session.delete(url) + + return body def abandon(self, zone): zone = v2_utils.resolve_by_name(self.list, zone) @@ -166,3 +172,29 @@ class ZoneImportsController(V2Controller): def delete(self, zone_import_id): return self._delete('/zones/tasks/imports/%s' % zone_import_id) + + +class ZoneShareController(V2Controller): + def create(self, zone, target_project_id): + zone_id = v2_utils.resolve_by_name(self.client.zones.list, zone) + + data = {"target_project_id": target_project_id} + + return self._post(f'/zones/{zone_id}/shares', data=data) + + def list(self, zone, criterion=None, marker=None, limit=None): + zone_id = v2_utils.resolve_by_name(self.client.zones.list, zone) + url = self.build_url(f'/zones/{zone_id}/shares', + criterion, marker, limit) + + return self._get(url, response_key='shared_zones') + + def delete(self, zone, shared_zone_id): + zone_id = v2_utils.resolve_by_name(self.client.zones.list, zone) + + return self._delete(f'/zones/{zone_id}/shares/{shared_zone_id}') + + def get(self, zone, shared_zone_id): + zone_id = v2_utils.resolve_by_name(self.client.zones.list, zone) + + return self._get(f'/zones/{zone_id}/shares/{shared_zone_id}') |
