Removing v1 api support
The v1 has officially been removed from Designate since the Queens release, and was deperecated long before that. Change-Id: Ic5b44761ff939e2b319924af87849b3a79f9cb07
This commit is contained in:
parent
5c9bbbfac8
commit
093d8d7170
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import sys
|
||||
from designateclient.shell import DesignateShell
|
||||
|
||||
shell = DesignateShell()
|
||||
sys.exit(shell.run(sys.argv[1:]))
|
|
@ -1,143 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import abc
|
||||
import warnings
|
||||
|
||||
from keystoneauth1 import exceptions as ks_exceptions
|
||||
from osc_lib.command import command
|
||||
import six
|
||||
|
||||
from designateclient import exceptions
|
||||
from designateclient import utils
|
||||
from designateclient.v1 import Client
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
class Command(command.Command):
|
||||
def run(self, parsed_args):
|
||||
|
||||
warnings.simplefilter('once', category=DeprecationWarning)
|
||||
warnings.warn(
|
||||
'The "designate" CLI is being deprecated in favour of the '
|
||||
'"openstack" CLI plugin. All designate API v2 commands are '
|
||||
'implemented there. When the v1 API is removed this CLI will '
|
||||
'stop functioning',
|
||||
DeprecationWarning)
|
||||
warnings.resetwarnings()
|
||||
warnings.simplefilter('ignore', category=DeprecationWarning)
|
||||
|
||||
self.client = Client(
|
||||
region_name=self.app.options.os_region_name,
|
||||
service_type=self.app.options.os_service_type,
|
||||
endpoint_type=self.app.options.os_endpoint_type,
|
||||
session=self.app.session,
|
||||
all_tenants=self.app.options.all_tenants,
|
||||
edit_managed=self.app.options.edit_managed,
|
||||
endpoint=self.app.options.os_endpoint)
|
||||
warnings.resetwarnings()
|
||||
try:
|
||||
return super(Command, self).run(parsed_args)
|
||||
except exceptions.RemoteError as e:
|
||||
columns = ['Code', 'Type']
|
||||
values = [e.code, e.type]
|
||||
|
||||
if e.message:
|
||||
columns.append('Message')
|
||||
values.append(e.message)
|
||||
|
||||
if e.errors:
|
||||
columns.append('Errors')
|
||||
values.append(e.errors)
|
||||
|
||||
self.error_output(parsed_args, columns, values)
|
||||
except ks_exceptions.EndpointNotFound as e:
|
||||
self.app.log.error('No endpoint was found. You must provide a '
|
||||
'username or user id via --os-username, '
|
||||
'--os-user-id, env[OS_USERNAME] or '
|
||||
'env[OS_USER_ID]. You may also be using a '
|
||||
'cloud that does not have the V1 API enabled. '
|
||||
'If your cloud does not have the V1 DNS API '
|
||||
'use the openstack CLI to interact with the '
|
||||
'DNS Service.')
|
||||
|
||||
return 1
|
||||
|
||||
def error_output(self, parsed_args, column_names, data):
|
||||
self.formatter.emit_one(column_names,
|
||||
data,
|
||||
self.app.stdout,
|
||||
parsed_args)
|
||||
self.app.log.error('The requested action did not complete '
|
||||
'successfully')
|
||||
|
||||
@abc.abstractmethod
|
||||
def execute(self, parsed_args):
|
||||
"""
|
||||
Execute something, this is since we overload self.take_action()
|
||||
in order to format the data
|
||||
|
||||
This method __NEEDS__ to be overloaded!
|
||||
|
||||
:param parsed_args: The parsed args that are given by take_action()
|
||||
"""
|
||||
|
||||
def post_execute(self, data):
|
||||
"""
|
||||
Format the results locally if needed, by default we just return data
|
||||
|
||||
:param data: Whatever is returned by self.execute()
|
||||
"""
|
||||
return data
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
results = self.execute(parsed_args)
|
||||
return self.post_execute(results)
|
||||
|
||||
def find_resourceid_by_name_or_id(self, resource_plural, name_or_id):
|
||||
resource_client = getattr(self.client, resource_plural)
|
||||
return utils.find_resourceid_by_name_or_id(resource_client, name_or_id)
|
||||
|
||||
|
||||
class ListCommand(Command, command.Lister):
|
||||
columns = None
|
||||
|
||||
def post_execute(self, results):
|
||||
if len(results) > 0:
|
||||
columns = self.columns or utils.get_columns(results)
|
||||
data = [utils.get_item_properties(i, columns) for i in results]
|
||||
return columns, data
|
||||
else:
|
||||
return [], ()
|
||||
|
||||
|
||||
class GetCommand(Command, command.ShowOne):
|
||||
def post_execute(self, results):
|
||||
return results.keys(), results.values()
|
||||
|
||||
|
||||
class CreateCommand(Command, command.ShowOne):
|
||||
def post_execute(self, results):
|
||||
return results.keys(), results.values()
|
||||
|
||||
|
||||
class UpdateCommand(Command, command.ShowOne):
|
||||
def post_execute(self, results):
|
||||
return results.keys(), results.values()
|
||||
|
||||
|
||||
class DeleteCommand(Command, command.ShowOne):
|
||||
def post_execute(self, results):
|
||||
return [], []
|
|
@ -1,38 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class PingCommand(base.GetCommand):
|
||||
"""Ping a service on a given host"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(PingCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('--service', help="Service name (e.g. central)",
|
||||
required=True)
|
||||
parser.add_argument('--host', help="Hostname", required=True)
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.diagnostics.ping(parsed_args.service,
|
||||
parsed_args.host)
|
|
@ -1,144 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
from designateclient.v1.domains import Domain
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ListDomainsCommand(base.ListCommand):
|
||||
"""List Domains"""
|
||||
|
||||
columns = ['id', 'name', 'serial']
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.domains.list()
|
||||
|
||||
|
||||
class GetDomainCommand(base.GetCommand):
|
||||
"""Get Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(GetDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Domain ID or name.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
id = self.find_resourceid_by_name_or_id('domains', parsed_args.id)
|
||||
return self.client.domains.get(id)
|
||||
|
||||
|
||||
class CreateDomainCommand(base.CreateCommand):
|
||||
"""Create Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('--name', help="Domain name.", required=True)
|
||||
parser.add_argument('--email', help="Domain email.", required=True)
|
||||
parser.add_argument('--ttl', type=int, help="Time to live (seconds).")
|
||||
parser.add_argument('--description', help="Description.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
domain = Domain(
|
||||
name=parsed_args.name,
|
||||
email=parsed_args.email,
|
||||
)
|
||||
|
||||
if parsed_args.description:
|
||||
domain.description = parsed_args.description
|
||||
|
||||
if parsed_args.ttl is not None:
|
||||
domain.ttl = parsed_args.ttl
|
||||
|
||||
return self.client.domains.create(domain)
|
||||
|
||||
|
||||
class UpdateDomainCommand(base.UpdateCommand):
|
||||
"""Update Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Domain ID or name.")
|
||||
parser.add_argument('--name', help="Domain name.")
|
||||
parser.add_argument('--email', help="Domain email.")
|
||||
parser.add_argument('--ttl', type=int, help="Time to live (seconds).")
|
||||
description_group = parser.add_mutually_exclusive_group()
|
||||
description_group.add_argument('--description', help="Description.")
|
||||
description_group.add_argument('--no-description', action='store_true')
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
# TODO(kiall): API needs updating.. this get is silly
|
||||
id = self.find_resourceid_by_name_or_id('domains', parsed_args.id)
|
||||
domain = self.client.domains.get(id)
|
||||
|
||||
if parsed_args.name:
|
||||
domain.name = parsed_args.name
|
||||
|
||||
if parsed_args.email:
|
||||
domain.email = parsed_args.email
|
||||
|
||||
if parsed_args.ttl is not None:
|
||||
domain.ttl = parsed_args.ttl
|
||||
|
||||
if parsed_args.no_description:
|
||||
domain.description = None
|
||||
elif parsed_args.description:
|
||||
domain.description = parsed_args.description
|
||||
|
||||
return self.client.domains.update(domain)
|
||||
|
||||
|
||||
class DeleteDomainCommand(base.DeleteCommand):
|
||||
"""Delete Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Domain ID or name.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
id = self.find_resourceid_by_name_or_id('domains', parsed_args.id)
|
||||
return self.client.domains.delete(id)
|
||||
|
||||
|
||||
class ListDomainServersCommand(base.ListCommand):
|
||||
"""List Domain Servers"""
|
||||
|
||||
columns = ['name']
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListDomainServersCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Domain ID or name.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
id = self.find_resourceid_by_name_or_id('domains', parsed_args.id)
|
||||
return self.client.domains.list_domain_servers(id)
|
|
@ -1,83 +0,0 @@
|
|||
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# Author: Endre Karlson <endre.karlson@hp.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class GetQuotaCommand(base.GetCommand):
|
||||
"""Get Quota"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(GetQuotaCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('tenant_id', help="Tenant ID")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.quotas.get(parsed_args.tenant_id)
|
||||
|
||||
|
||||
class UpdateQuotaCommand(base.UpdateCommand):
|
||||
"""Update Quota"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateQuotaCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('tenant_id', help="Tenant ID.")
|
||||
parser.add_argument('--domains', help="Allowed domains.", type=int)
|
||||
parser.add_argument('--domain-recordsets',
|
||||
help="Allowed domain records.",
|
||||
type=int)
|
||||
parser.add_argument('--recordset-records',
|
||||
help="Allowed recordset records.",
|
||||
type=int)
|
||||
parser.add_argument('--domain-records',
|
||||
help="Allowed domain records.",
|
||||
type=int)
|
||||
parser.add_argument('--api-export-size',
|
||||
help="Allowed zone export recordsets.",
|
||||
type=int)
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
# TODO(kiall): API needs updating.. this get is silly
|
||||
quota = self.client.quotas.get(parsed_args.tenant_id)
|
||||
|
||||
for key, old in quota.items():
|
||||
new = getattr(parsed_args, key)
|
||||
if new is not None and new != old:
|
||||
quota[key] = new
|
||||
return self.client.quotas.update(parsed_args.tenant_id, quota)
|
||||
|
||||
|
||||
class ResetQuotaCommand(base.DeleteCommand):
|
||||
"""Reset Quota"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ResetQuotaCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('tenant_id', help="Tenant ID.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
self.client.quotas.reset(parsed_args.tenant_id)
|
|
@ -1,187 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
from designateclient.v1.records import Record
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ListRecordsCommand(base.ListCommand):
|
||||
"""List Records"""
|
||||
|
||||
columns = ['id', 'type', 'name', 'data']
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListRecordsCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID or name.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
domain_id = self.find_resourceid_by_name_or_id(
|
||||
'domains', parsed_args.domain_id)
|
||||
return self.client.records.list(domain_id)
|
||||
|
||||
|
||||
class GetRecordCommand(base.GetCommand):
|
||||
"""Get Record"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(GetRecordCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID or name.")
|
||||
parser.add_argument('id', help="Record ID.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
domain_id = self.find_resourceid_by_name_or_id(
|
||||
'domains', parsed_args.domain_id)
|
||||
return self.client.records.get(domain_id, parsed_args.id)
|
||||
|
||||
|
||||
class CreateRecordCommand(base.CreateCommand):
|
||||
"""Create Record"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateRecordCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID or name.")
|
||||
parser.add_argument(
|
||||
'--name', help="Record (relative|absolute) name.", required=True)
|
||||
parser.add_argument('--type', help="Record type.", required=True)
|
||||
parser.add_argument('--data', help="Record data.", required=True)
|
||||
parser.add_argument('--ttl', type=int, help="Record TTL.")
|
||||
parser.add_argument('--priority', type=int, help="Record priority.")
|
||||
parser.add_argument('--description', help="Description.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
domain_id = self.find_resourceid_by_name_or_id(
|
||||
'domains', parsed_args.domain_id)
|
||||
|
||||
if not parsed_args.name.endswith('.'):
|
||||
# Relative name?
|
||||
domain_name = self.client.domains.get(domain_id)['name']
|
||||
absolute = parsed_args.name + '.'
|
||||
relative = absolute + domain_name
|
||||
if absolute.endswith('.' + domain_name):
|
||||
# Relative name or absolute name missing final period?
|
||||
msg = ('"%s" is a relative name but looks like an absolute '
|
||||
'name, use --name "%s" or "%s"'
|
||||
% (parsed_args.name, absolute, relative))
|
||||
raise ValueError(msg)
|
||||
parsed_args.name = relative
|
||||
|
||||
record = Record(
|
||||
name=parsed_args.name,
|
||||
type=parsed_args.type,
|
||||
data=parsed_args.data,
|
||||
)
|
||||
|
||||
if parsed_args.ttl is not None:
|
||||
record.ttl = parsed_args.ttl
|
||||
|
||||
if parsed_args.priority is not None:
|
||||
record.priority = parsed_args.priority
|
||||
|
||||
if parsed_args.description:
|
||||
record.description = parsed_args.description
|
||||
|
||||
return self.client.records.create(domain_id, record)
|
||||
|
||||
|
||||
class UpdateRecordCommand(base.UpdateCommand):
|
||||
"""Update Record"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateRecordCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID or name.")
|
||||
parser.add_argument('id', help="Record ID.")
|
||||
parser.add_argument('--name', help="Record name.")
|
||||
parser.add_argument('--type', help="Record type.")
|
||||
parser.add_argument('--data', help="Record data.")
|
||||
|
||||
description_group = parser.add_mutually_exclusive_group()
|
||||
description_group.add_argument('--description', help="Description.")
|
||||
description_group.add_argument('--no-description', action='store_true')
|
||||
|
||||
ttl_group = parser.add_mutually_exclusive_group()
|
||||
ttl_group.add_argument('--ttl', type=int,
|
||||
help="Record time to live (seconds).")
|
||||
ttl_group.add_argument('--no-ttl', action='store_true')
|
||||
|
||||
priotity_group = parser.add_mutually_exclusive_group()
|
||||
priotity_group.add_argument('--priority', type=int,
|
||||
help="Record priority.")
|
||||
priotity_group.add_argument('--no-priority', action='store_true')
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
# TODO(kiall): API needs updating.. this get is silly
|
||||
record = self.client.records.get(parsed_args.domain_id, parsed_args.id)
|
||||
|
||||
if parsed_args.name:
|
||||
record.name = parsed_args.name
|
||||
|
||||
if parsed_args.type:
|
||||
record.type = parsed_args.type
|
||||
|
||||
if parsed_args.data:
|
||||
record.data = parsed_args.data
|
||||
|
||||
if parsed_args.no_ttl:
|
||||
record.ttl = None
|
||||
elif parsed_args.ttl is not None:
|
||||
record.ttl = parsed_args.ttl
|
||||
|
||||
if parsed_args.no_priority:
|
||||
record.priority = None
|
||||
elif parsed_args.priority is not None:
|
||||
record.priority = parsed_args.priority
|
||||
|
||||
if parsed_args.no_description:
|
||||
record.description = None
|
||||
elif parsed_args.description:
|
||||
record.description = parsed_args.description
|
||||
|
||||
domain_id = self.find_resourceid_by_name_or_id(
|
||||
'domains', parsed_args.domain_id)
|
||||
return self.client.records.update(domain_id, record)
|
||||
|
||||
|
||||
class DeleteRecordCommand(base.DeleteCommand):
|
||||
"""Delete Record"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteRecordCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID or name.")
|
||||
parser.add_argument('id', help="Record ID.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
domain_id = self.find_resourceid_by_name_or_id(
|
||||
'domains', parsed_args.domain_id)
|
||||
return self.client.records.delete(domain_id, parsed_args.id)
|
|
@ -1,71 +0,0 @@
|
|||
# Copyright 2013 Hewlett-Packard Development Company, L.P. All Rights Reserved.
|
||||
#
|
||||
# Author: Patrick Galbraith <patg@patg.net>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from designateclient.cli import base
|
||||
|
||||
|
||||
class DomainCountCommand(base.GetCommand):
|
||||
"""Get counts for total domains"""
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.count_domains()
|
||||
|
||||
|
||||
class RecordCountCommand(base.GetCommand):
|
||||
"""Get counts for total records"""
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.count_records()
|
||||
|
||||
|
||||
class TenantCountCommand(base.GetCommand):
|
||||
"""Get counts for total tenants"""
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.count_tenants()
|
||||
|
||||
|
||||
class CountsCommand(base.GetCommand):
|
||||
"""Get count totals for all tenants, domains and records"""
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.count_all()
|
||||
|
||||
|
||||
class TenantsCommand(base.ListCommand):
|
||||
"""Get list of tenants and domain count for each"""
|
||||
|
||||
columns = ['domain_count', 'id']
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.tenants_all()
|
||||
|
||||
|
||||
class TenantCommand(base.ListCommand):
|
||||
"""Get a list of domains for given tenant"""
|
||||
|
||||
columns = ['domain']
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(TenantCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('--report-tenant-id',
|
||||
help="The tenant_id being reported on.",
|
||||
required=True)
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.reports.tenant_domains(parsed_args.report_tenant_id)
|
|
@ -1,98 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
from designateclient.v1.servers import Server
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ListServersCommand(base.ListCommand):
|
||||
"""List Servers"""
|
||||
|
||||
columns = ['id', 'name']
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.servers.list()
|
||||
|
||||
|
||||
class GetServerCommand(base.GetCommand):
|
||||
"""Get Server"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(GetServerCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Server ID.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.servers.get(parsed_args.id)
|
||||
|
||||
|
||||
class CreateServerCommand(base.CreateCommand):
|
||||
"""Create Server"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateServerCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('--name', help="Server name.", required=True)
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
server = Server(
|
||||
name=parsed_args.name,
|
||||
)
|
||||
|
||||
return self.client.servers.create(server)
|
||||
|
||||
|
||||
class UpdateServerCommand(base.UpdateCommand):
|
||||
"""Update Server"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateServerCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Server ID.")
|
||||
parser.add_argument('--name', help="Server name.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
# TODO(kiall): API needs updating.. this get is silly
|
||||
server = self.client.servers.get(parsed_args.id)
|
||||
|
||||
if parsed_args.name:
|
||||
server.name = parsed_args.name
|
||||
|
||||
return self.client.servers.update(server)
|
||||
|
||||
|
||||
class DeleteServerCommand(base.DeleteCommand):
|
||||
"""Delete Server"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteServerCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('id', help="Server ID.")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
return self.client.servers.delete(parsed_args.id)
|
|
@ -1,63 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SyncAllCommand(base.DeleteCommand):
|
||||
"""Sync Everything"""
|
||||
|
||||
def execute(self, parsed_args):
|
||||
self.client.sync.sync_all()
|
||||
|
||||
LOG.info('Synchronization of all domains scheduled')
|
||||
|
||||
|
||||
class SyncDomainCommand(base.DeleteCommand):
|
||||
"""Sync a single Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(SyncDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
self.client.sync.sync_domain(parsed_args.domain_id)
|
||||
|
||||
LOG.info('Synchronization of domain scheduled')
|
||||
|
||||
|
||||
class SyncRecordCommand(base.DeleteCommand):
|
||||
"""Sync a single Record"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(SyncRecordCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID")
|
||||
parser.add_argument('record_id', help="Record ID")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
self.client.sync.sync_record(parsed_args.domain_id,
|
||||
parsed_args.record_id)
|
||||
|
||||
LOG.info('Synchronization of record scheduled')
|
|
@ -1,37 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
|
||||
from designateclient.cli import base
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TouchDomainCommand(base.DeleteCommand):
|
||||
"""Touch a single Domain"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(TouchDomainCommand, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument('domain_id', help="Domain ID")
|
||||
|
||||
return parser
|
||||
|
||||
def execute(self, parsed_args):
|
||||
self.client.touch.domain(parsed_args.domain_id)
|
||||
|
||||
LOG.info('Domain touched successfully')
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
"""OpenStackClient plugin for DNS service."""
|
||||
|
||||
from osc_lib import utils as oscutils
|
||||
import os
|
||||
|
||||
from designateclient import shell
|
||||
from osc_lib import utils as oscutils
|
||||
|
||||
|
||||
DEFAULT_API_VERSION = '2'
|
||||
|
@ -45,7 +45,7 @@ def build_option_parser(parser):
|
|||
parser.add_argument(
|
||||
'--os-dns-api-version',
|
||||
metavar='<dns-api-version>',
|
||||
default=shell.env('OS_DNS_API_VERSION', default="2"),
|
||||
default=os.environ.get('OS_DNS_API_VERSION', '2'),
|
||||
help='DNS API version, default=' +
|
||||
DEFAULT_API_VERSION +
|
||||
' (Env: OS_DNS_API_VERSION)')
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
{
|
||||
"id": "domain",
|
||||
|
||||
"$schema": "http://json-schema.org/draft-03/hyper-schema",
|
||||
|
||||
"title": "domain",
|
||||
"description": "Domain",
|
||||
"additionalProperties": false,
|
||||
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Domain Identifier",
|
||||
"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
|
||||
"readonly": true
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Domain name",
|
||||
"format": "domain-name",
|
||||
"maxLength": 255,
|
||||
"required": true,
|
||||
"readonly": true
|
||||
},
|
||||
"email": {
|
||||
"type": "string",
|
||||
"description": "Hostmaster email address",
|
||||
"format": "email",
|
||||
"maxLength": 255,
|
||||
"required": true
|
||||
},
|
||||
"ttl": {
|
||||
"type": "integer",
|
||||
"description": "Time to live",
|
||||
"minimum": 1,
|
||||
"maximum": 2147483647
|
||||
},
|
||||
"serial": {
|
||||
"type": "integer",
|
||||
"description": "Serial Number",
|
||||
"minimum": 1,
|
||||
"maximum": 4294967295,
|
||||
"readonly": true
|
||||
},
|
||||
"description": {
|
||||
"type": ["string", "null"],
|
||||
"description": "Description for the Domain",
|
||||
"maxLength": 160
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"description": "Date and time of domain creation",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"description": "Date and time of last domain update",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
}
|
||||
},
|
||||
"links": [{
|
||||
"rel": "self",
|
||||
"href": "/domains/{id}"
|
||||
}, {
|
||||
"rel": "records",
|
||||
"href": "/domains/{id}/records"
|
||||
}, {
|
||||
"rel": "servers",
|
||||
"href": "/domains/{id}/servers"
|
||||
}, {
|
||||
"rel": "collection",
|
||||
"href": "/domains"
|
||||
}]
|
||||
}
|
|
@ -1,246 +0,0 @@
|
|||
{
|
||||
"id": "record",
|
||||
|
||||
"$schema": "http://json-schema.org/draft-03/hyper-schema",
|
||||
|
||||
"title": "record",
|
||||
"description": "Record",
|
||||
"additionalProperties": false,
|
||||
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Record Identifier",
|
||||
"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
|
||||
"readonly": true
|
||||
},
|
||||
"domain_id": {
|
||||
"type": "string",
|
||||
"description": "Domain Identifier",
|
||||
"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
|
||||
"readonly": true
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "DNS Record Name",
|
||||
"format": "host-name",
|
||||
"maxLength": 255,
|
||||
"required": true
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "DNS Record Type",
|
||||
"enum": ["A", "AAAA", "CNAME", "MX", "SRV", "TXT", "SPF", "NS", "PTR", "SSHFP", "SOA"],
|
||||
"required": true
|
||||
},
|
||||
"data": {
|
||||
"type": "string",
|
||||
"description": "DNS Record Value",
|
||||
"maxLength": 255,
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": ["integer", "null"],
|
||||
"description": "DNS Record Priority",
|
||||
"minimum": 0,
|
||||
"maximum": 65535
|
||||
},
|
||||
"ttl": {
|
||||
"type": ["integer", "null"],
|
||||
"description": "Time to live",
|
||||
"minimum": 1,
|
||||
"maximum": 2147483647
|
||||
},
|
||||
"description": {
|
||||
"type": ["string", "null"],
|
||||
"description": "Description for the record",
|
||||
"maxLength": 160
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"description": "Date and time of record creation",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"description": "Date and time of last record update",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
}
|
||||
},
|
||||
"oneOf": [{
|
||||
"description": "An A Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["A"]
|
||||
},
|
||||
"data": {
|
||||
"format": "ip-address",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "An AAAA Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["AAAA"]
|
||||
},
|
||||
"data": {
|
||||
"format": "ipv6",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A CNAME Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["CNAME"]
|
||||
},
|
||||
"data": {
|
||||
"format": "host-name",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A MX Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["MX"]
|
||||
},
|
||||
"data": {
|
||||
"format": "host-name",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"required": true
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A SRV Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["SRV"]
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"pattern": "^(?:_[A-Za-z0-9_\\-]{1,62}\\.){2}"
|
||||
},
|
||||
"data": {
|
||||
"type": "string",
|
||||
"pattern": "^(?:(?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])\\s){2}(?!.{255,})((?!\\-)[A-Za-z0-9_\\-]{1,63}(?<!\\-)\\.)+$"
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"required": true
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A TXT Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["TXT"]
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A SPF Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["SPF"]
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A NS Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["NS"]
|
||||
},
|
||||
"data": {
|
||||
"format": "host-name",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A PTR Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["PTR"]
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"pattern": "^(?:(?:\\d{1,3}\\.){4}in-addr\\.arpa\\.|(?:[a-f|\\d]\\.){32}ip6\\.arpa\\.)$"
|
||||
},
|
||||
"data": {
|
||||
"format": "host-name",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A SSHFP Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["SSHFP"]
|
||||
},
|
||||
"data": {
|
||||
"pattern": "^[1-2] 1 [0-9A-Fa-f]{40}$",
|
||||
"required": true
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"description": "A SOA Record",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["SOA"]
|
||||
},
|
||||
"priority": {
|
||||
"type": "null"
|
||||
}
|
||||
}
|
||||
}],
|
||||
"links": [{
|
||||
"rel": "self",
|
||||
"href": "/domains/{domain_id}/records/{id}"
|
||||
}, {
|
||||
"rel": "domain",
|
||||
"href": "/domains/{domain_id}"
|
||||
}, {
|
||||
"rel": "collection",
|
||||
"href": "/domains/{domain_id}/records"
|
||||
}]
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
{
|
||||
"id": "server",
|
||||
|
||||
"$schema": "http://json-schema.org/draft-03/hyper-schema",
|
||||
|
||||
"title": "server",
|
||||
"description": "Server",
|
||||
"additionalProperties": false,
|
||||
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Server Identifier",
|
||||
"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
|
||||
"readonly": true
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Server DNS name",
|
||||
"format": "host-name",
|
||||
"maxLength": 255,
|
||||
"required": true
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"description": "Date and time of server creation",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"description": "Date and time of last server update",
|
||||
"format": "date-time",
|
||||
"readonly": true
|
||||
}
|
||||
},
|
||||
"links": [{
|
||||
"rel": "self",
|
||||
"href": "/servers/{id}"
|
||||
}, {
|
||||
"rel": "collection",
|
||||
"href": "/servers"
|
||||
}]
|
||||
}
|
|
@ -1,252 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import logging
|
||||
import os
|
||||
import traceback
|
||||
|
||||
from cliff.app import App
|
||||
from cliff.commandmanager import CommandManager
|
||||
|
||||
from designateclient import utils
|
||||
from designateclient.version import version_info as version
|
||||
|
||||
|
||||
def env(*vars, **kwargs):
|
||||
"""Search for the first defined of possibly many env vars
|
||||
|
||||
Returns the first environment variable defined in vars, or
|
||||
returns the default defined in kwargs.
|
||||
|
||||
"""
|
||||
for v in vars:
|
||||
value = os.environ.get(v)
|
||||
if value:
|
||||
return value
|
||||
return kwargs.get('default', '')
|
||||
|
||||
|
||||
class DesignateShell(App):
|
||||
CONSOLE_MESSAGE_FORMAT = '%(levelname)s: %(message)s'
|
||||
DEFAULT_VERBOSE_LEVEL = 0
|
||||
|
||||
def __init__(self):
|
||||
super(DesignateShell, self).__init__(
|
||||
description='Designate Client',
|
||||
version=version.version_string(),
|
||||
command_manager=CommandManager('designateclient.cli'),
|
||||
)
|
||||
|
||||
self.log = logging.getLogger(__name__)
|
||||
|
||||
def build_option_parser(self, description, version):
|
||||
parser = super(DesignateShell, self).build_option_parser(
|
||||
description, version)
|
||||
|
||||
parser.add_argument('--os-username',
|
||||
default=env('OS_USERNAME'),
|
||||
help='Name used for authentication with the '
|
||||
'OpenStack Identity service. '
|
||||
'Defaults to env[OS_USERNAME].')
|
||||
|
||||
parser.add_argument('--os-user-id',
|
||||
default=env('OS_USER_ID'),
|
||||
help='User ID used for authentication with the '
|
||||
'OpenStack Identity service. '
|
||||
'Defaults to env[OS_USER_ID].')
|
||||
|
||||
parser.add_argument('--os-user-domain-id',
|
||||
default=env('OS_USER_DOMAIN_ID'),
|
||||
help='Defaults to env[OS_USER_DOMAIN_ID].')
|
||||
|
||||
parser.add_argument('--os-user-domain-name',
|
||||
default=env('OS_USER_DOMAIN_NAME'),
|
||||
help='Defaults to env[OS_USER_DOMAIN_NAME].')
|
||||
|
||||
parser.add_argument('--os-password',
|
||||
default=env('OS_PASSWORD'),
|
||||
help='Password used for authentication with the '
|
||||
'OpenStack Identity service. '
|
||||
'Defaults to env[OS_PASSWORD].')
|
||||
|
||||
parser.add_argument('--os-tenant-name',
|
||||
default=env('OS_TENANT_NAME'),
|
||||
help='Tenant to request authorization on. '
|
||||
'Defaults to env[OS_TENANT_NAME].')
|
||||
|
||||
parser.add_argument('--os-tenant-id',
|
||||
default=env('OS_TENANT_ID'),
|
||||
help='Tenant to request authorization on. '
|
||||
'Defaults to env[OS_TENANT_ID].')
|
||||
|
||||
parser.add_argument('--os-project-name',
|
||||
default=env('OS_PROJECT_NAME'),
|
||||
help='Project to request authorization on. '
|
||||
'Defaults to env[OS_PROJECT_NAME].')
|
||||
|
||||
parser.add_argument('--os-domain-name',
|
||||
default=env('OS_DOMAIN_NAME'),
|
||||
help='Project to request authorization on. '
|
||||
'Defaults to env[OS_DOMAIN_NAME].')
|
||||
|
||||
parser.add_argument('--os-domain-id',
|
||||
default=env('OS_DOMAIN_ID'),
|
||||
help='Defaults to env[OS_DOMAIN_ID].')
|
||||
|
||||
parser.add_argument('--os-project-id',
|
||||
default=env('OS_PROJECT_ID'),
|
||||
help='Project to request authorization on. '
|
||||
'Defaults to env[OS_PROJECT_ID].')
|
||||
|
||||
parser.add_argument('--os-project-domain-id',
|
||||
default=env('OS_PROJECT_DOMAIN_ID'),
|
||||
help='Defaults to env[OS_PROJECT_DOMAIN_ID].')
|
||||
|
||||
parser.add_argument('--os-project-domain-name',
|
||||
default=env('OS_PROJECT_DOMAIN_NAME'),
|
||||
help='Defaults to env[OS_PROJECT_DOMAIN_NAME].')
|
||||
|
||||
parser.add_argument('--os-auth-url',
|
||||
default=env('OS_AUTH_URL'),
|
||||
help='Specify the Identity endpoint to use for '
|
||||
'authentication. '
|
||||
'Defaults to env[OS_AUTH_URL].')
|
||||
|
||||
parser.add_argument('--os-region-name',
|
||||
default=env('OS_REGION_NAME'),
|
||||
help='Specify the region to use. '
|
||||
'Defaults to env[OS_REGION_NAME].')
|
||||
|
||||
parser.add_argument('--os-token',
|
||||
default=env('OS_SERVICE_TOKEN'),
|
||||
help='Specify an existing token to use instead of '
|
||||
'retrieving one via authentication (e.g. '
|
||||
'with username & password). '
|
||||
'Defaults to env[OS_SERVICE_TOKEN].')
|
||||
|
||||
parser.add_argument('--os-endpoint',
|
||||
default=env('OS_DNS_ENDPOINT',
|
||||
'OS_SERVICE_ENDPOINT'),
|
||||
help='Specify an endpoint to use instead of '
|
||||
'retrieving one from the service catalog '
|
||||
'(via authentication). '
|
||||
'Defaults to env[OS_DNS_ENDPOINT].')
|
||||
|
||||
parser.add_argument('--os-endpoint-type',
|
||||
default=env('OS_ENDPOINT_TYPE',
|
||||
default='publicURL'),
|
||||
help='Defaults to env[OS_ENDPOINT_TYPE].')
|
||||
|
||||
parser.add_argument('--os-service-type',
|
||||
default=env('OS_DNS_SERVICE_TYPE', default='dns'),
|
||||
help=("Defaults to env[OS_DNS_SERVICE_TYPE], or "
|
||||
"'dns'."))
|
||||
|
||||
parser.add_argument('--os-cacert',
|
||||
default=env('OS_CACERT'),
|
||||
help=('CA certificate bundle file. Defaults to '
|
||||
'env[OS_CACERT].'))
|
||||
|
||||
parser.add_argument('--insecure', action='store_true',
|
||||
help="Explicitly allow 'insecure' SSL requests.")
|
||||
|
||||
parser.add_argument('--all-tenants', action='store_true',
|
||||
help="Allows to list all domains from all "
|
||||
"tenants.")
|
||||
|
||||
parser.add_argument('--edit-managed', action='store_true',
|
||||
help='Allows to edit records that are marked as '
|
||||
'managed.')
|
||||
|
||||
return parser
|
||||
|
||||
def configure_logging(self):
|
||||
"""Configure logging for the app
|
||||
|
||||
Cliff sets some defaults we don't want so re-work it a bit
|
||||
"""
|
||||
|
||||
if self.options.debug:
|
||||
# --debug forces verbose_level 3
|
||||
# Set this here so cliff.app.configure_logging() can work
|
||||
self.options.verbose_level = 3
|
||||
|
||||
super(DesignateShell, self).configure_logging()
|
||||
root_logger = logging.getLogger('')
|
||||
|
||||
# Requests logs some stuff at INFO that we don't want
|
||||
# unless we have DEBUG
|
||||
requests_log = logging.getLogger("requests")
|
||||
requests_log.setLevel(logging.ERROR)
|
||||
|
||||
# Other modules we don't want DEBUG output for so
|
||||
# don't reset them below
|
||||
iso8601_log = logging.getLogger("iso8601")
|
||||
iso8601_log.setLevel(logging.ERROR)
|
||||
|
||||
# Set logging to the requested level
|
||||
self.dump_stack_trace = False
|
||||
if self.options.verbose_level == 0:
|
||||
# --quiet
|
||||
root_logger.setLevel(logging.ERROR)
|
||||
elif self.options.verbose_level == 1:
|
||||
# This is the default case, no --debug, --verbose or --quiet
|
||||
root_logger.setLevel(logging.WARNING)
|
||||
elif self.options.verbose_level == 2:
|
||||
# One --verbose
|
||||
root_logger.setLevel(logging.INFO)
|
||||
elif self.options.verbose_level >= 3:
|
||||
# Two or more --verbose
|
||||
root_logger.setLevel(logging.DEBUG)
|
||||
requests_log.setLevel(logging.DEBUG)
|
||||
|
||||
if self.options.debug:
|
||||
# --debug forces traceback
|
||||
self.dump_stack_trace = True
|
||||
|
||||
def initialize_app(self, argv):
|
||||
super(DesignateShell, self).initialize_app(argv)
|
||||
self.session = utils.get_session(
|
||||
auth_url=self.options.os_auth_url,
|
||||
endpoint=self.options.os_endpoint,
|
||||
domain_id=self.options.os_domain_id,
|
||||
domain_name=self.options.os_domain_name,
|
||||
project_id=self.options.os_project_id or self.options.os_tenant_id,
|
||||
project_name=(self.options.os_project_name or
|
||||
self.options.os_tenant_name),
|
||||
project_domain_name=self.options.os_project_domain_name,
|
||||
project_domain_id=self.options.os_project_domain_id,
|
||||
username=self.options.os_username,
|
||||
user_id=self.options.os_user_id,
|
||||
password=self.options.os_password,
|
||||
user_domain_id=self.options.os_user_domain_id,
|
||||
user_domain_name=self.options.os_user_domain_name,
|
||||
token=self.options.os_token,
|
||||
insecure=self.options.insecure,
|
||||
cacert=self.options.os_cacert
|
||||
)
|
||||
|
||||
def run(self, argv):
|
||||
try:
|
||||
return super(DesignateShell, self).run(argv)
|
||||
except Exception as e:
|
||||
if not logging.getLogger('').handlers:
|
||||
logging.basicConfig()
|
||||
if self.dump_stack_trace:
|
||||
self.log.error(traceback.format_exc(e))
|
||||
else:
|
||||
self.log.error('Exception raised: ' + str(e))
|
||||
return 1
|
|
@ -62,24 +62,3 @@ class UtilsTestCase(base.TestCase):
|
|||
self.assertRaises(exceptions.NoUniqueMatch,
|
||||
self._find_resourceid_by_name_or_id,
|
||||
'baba', by_name=True)
|
||||
|
||||
def test_load_schema(self):
|
||||
schema = utils.load_schema('v1', 'domain')
|
||||
self.assertIsInstance(schema, dict)
|
||||
|
||||
def test_load_schema_missing(self):
|
||||
self.assertRaises(exceptions.ResourceNotFound, utils.load_schema,
|
||||
'v1', 'missing')
|
||||
|
||||
def test_resource_string_empty_param(self):
|
||||
self.assertRaises(ValueError, utils.resource_string)
|
||||
|
||||
def test_resource_string(self):
|
||||
name = ['schemas', 'v1', 'domain.json']
|
||||
resource_string = utils.resource_string(*name)
|
||||
self.assertIsNotNone(resource_string)
|
||||
|
||||
def test_resource_string_missing(self):
|
||||
name = ['schemas', 'v1', 'missing']
|
||||
self.assertRaises(exceptions.ResourceNotFound, utils.resource_string,
|
||||
*name)
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
# Copyright 2015 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@hp.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import uuid
|
||||
|
||||
from designateclient.tests import base
|
||||
|
||||
|
||||
class CrudMixin(object):
|
||||
path_prefix = None
|
||||
|
||||
def new_ref(self, **kwargs):
|
||||
kwargs.setdefault('id', uuid.uuid4().hex)
|
||||
return kwargs
|
||||
|
||||
def stub_entity(self, method, parts=None, entity=None, id=None, **kwargs):
|
||||
if entity:
|
||||
kwargs['json'] = entity
|
||||
|
||||
if not parts:
|
||||
parts = [self.RESOURCE]
|
||||
|
||||
if self.path_prefix:
|
||||
parts.insert(0, self.path_prefix)
|
||||
|
||||
if id:
|
||||
if not parts:
|
||||
parts = []
|
||||
|
||||
parts.append(id)
|
||||
|
||||
self.stub_url(method, parts=parts, **kwargs)
|
||||
|
||||
def assertList(self, expected, actual):
|
||||
self.assertEqual(len(expected), len(actual))
|
||||
for i in expected:
|
||||
self.assertIn(i, actual)
|
||||
|
||||
|
||||
class APIV1TestCase(base.APITestCase):
|
||||
VERSION = "1"
|
|
@ -1,124 +0,0 @@
|
|||
# Copyright 2015 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@hp.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient import utils
|
||||
from designateclient import v1
|
||||
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
||||
|
||||
class TestClient(test_v1.APIV1TestCase):
|
||||
def test_all_tenants(self):
|
||||
# Create a client with the all_tenants flag set to True
|
||||
client = v1.Client(all_tenants=True)
|
||||
|
||||
# Verify this has been picked up
|
||||
self.assertTrue(client.all_tenants)
|
||||
|
||||
def test_all_tenants_not_supplied(self):
|
||||
# Create a client without supplying any all_tenants flag
|
||||
client = v1.Client()
|
||||
|
||||
# Verify all_tenants is False
|
||||
self.assertFalse(client.all_tenants)
|
||||
self.assertIsNotNone(client.all_tenants)
|
||||
|
||||
def test_all_tenants_through_session(self):
|
||||
# Create a session with the all_tenants flag set to True
|
||||
session = utils.get_session(
|
||||
auth_url='Anything',
|
||||
endpoint='Anything',
|
||||
domain_id='Anything',
|
||||
domain_name='Anything',
|
||||
project_id='Anything',
|
||||
project_name='Anything',
|
||||
project_domain_name='Anything',
|
||||
project_domain_id='Anything',
|
||||
username='Anything',
|
||||
user_id='Anything',
|
||||
password='Anything',
|
||||
user_domain_id='Anything',
|
||||
user_domain_name='Anything',
|
||||
token=None,
|
||||
insecure=False,
|
||||
cacert=None,
|
||||
all_tenants=True)
|
||||
|
||||
# Create a client using the pre-created session
|
||||
client = v1.Client(session=session)
|
||||
|
||||
# Verify the all_tenants flag has been picked up
|
||||
self.assertTrue(client.all_tenants)
|
||||
|
||||
def test_edit_managed(self):
|
||||
# Create a client with the edit_managed flag set to True
|
||||
client = v1.Client(edit_managed=True)
|
||||
|
||||
# Verify this has been picked up
|
||||
self.assertTrue(client.edit_managed)
|
||||
|
||||
def test_edit_managed_not_supplied(self):
|
||||
# Create a client without supplying any edit_managed flag
|
||||
client = v1.Client()
|
||||
|
||||
# Verify edit_managed is False
|
||||
self.assertFalse(client.edit_managed)
|
||||
self.assertIsNotNone(client.edit_managed)
|
||||
|
||||
def test_edit_managed_through_session(self):
|
||||
# Create a session with the edit_managed flag set to True
|
||||
session = utils.get_session(
|
||||
auth_url='Anything',
|
||||
endpoint='Anything',
|
||||
domain_id='Anything',
|
||||
domain_name='Anything',
|
||||
project_id='Anything',
|
||||
project_name='Anything',
|
||||
project_domain_name='Anything',
|
||||
project_domain_id='Anything',
|
||||
username='Anything',
|
||||
user_id='Anything',
|
||||
password='Anything',
|
||||
user_domain_id='Anything',
|
||||
user_domain_name='Anything',
|
||||
token=None,
|
||||
insecure=False,
|
||||
cacert=None,
|
||||
edit_managed=True)
|
||||
|
||||
# Create a client using the pre-created session
|
||||
client = v1.Client(session=session)
|
||||
|
||||
# Verify the edit_managed flag has been picked up
|
||||
self.assertTrue(client.edit_managed)
|
||||
|
||||
def test_timeout_new_session(self):
|
||||
client = v1.Client(
|
||||
auth_url="http://127.0.0.1:22/",
|
||||
timeout=1,
|
||||
)
|
||||
assert client.session.timeout == 1
|
||||
|
||||
def test_timeout_override_session_timeout(self):
|
||||
# The adapter timeout should override the session timeout
|
||||
session = keystone_session.Session(timeout=10)
|
||||
client = v1.Client(
|
||||
auth_url="http://127.0.0.1:22/",
|
||||
session=session,
|
||||
timeout=2,
|
||||
)
|
||||
self.assertEqual(2, client.session.timeout)
|
|
@ -1,30 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import diagnostics
|
||||
|
||||
|
||||
class TestDiagnostics(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
|
||||
@patch.object(diagnostics.DiagnosticsController, "ping")
|
||||
def test_ping(self, ping):
|
||||
args = mock.MagicMock()
|
||||
args.service = "foo"
|
||||
args.host = "host1"
|
||||
self.client.diagnostics.ping(args.host, args.service)
|
||||
self.client.diagnostics.ping.assert_called_with("host1", "foo")
|
|
@ -1,184 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import uuid
|
||||
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient import utils
|
||||
from designateclient.v1 import domains
|
||||
from designateclient import warlock
|
||||
|
||||
Domain = warlock.model_factory(utils.load_schema('v1', 'domain'))
|
||||
|
||||
|
||||
class TestDomain(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
RESOURCE = 'domains'
|
||||
|
||||
def new_ref(self, **kwargs):
|
||||
ref = super(TestDomain, self).new_ref(**kwargs)
|
||||
ref.setdefault("name", uuid.uuid4().hex)
|
||||
ref.setdefault("email", "abc@example.com.")
|
||||
ref.setdefault("ttl", 3600)
|
||||
return ref
|
||||
|
||||
def test_create(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": 60}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
response = self.client.domains.create(values["name"])
|
||||
self.assertEqual(ref['id'], response['id'])
|
||||
|
||||
def test_create_with_description(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": 60,
|
||||
"description": "fully qualified domain"}
|
||||
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
response = self.client.domains.create(values["name"])
|
||||
self.assertEqual(ref['id'], response['id'])
|
||||
|
||||
def test_create_with_description_too_long(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": 60,
|
||||
"description": "d" * 161}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.domains.create,
|
||||
values["name"])
|
||||
|
||||
def test_create_with_zero_ttl(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": 0}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.domains.create,
|
||||
values["name"])
|
||||
|
||||
def test_create_with_negative_ttl(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": -1}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.domains.create,
|
||||
values["name"])
|
||||
|
||||
def test_create_with_no_ttl(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain1.com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": ""}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.domains.create,
|
||||
values["name"])
|
||||
|
||||
def test_create_with_name_too_long(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "domain" + "a" * 255 + ".com.",
|
||||
"email": "nsadmin@example.org",
|
||||
"ttl": 60}
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.domains.create,
|
||||
values["name"])
|
||||
|
||||
def test_list(self):
|
||||
items = [
|
||||
self.new_ref(email="abc@example.org",
|
||||
id="89acac79-38e7-497d-807c-a011e1310438"),
|
||||
self.new_ref(email="root@example.org",
|
||||
id="89acac79-38e7-497d-807c-a011e1310435")
|
||||
]
|
||||
|
||||
self.stub_url("GET", parts=[self.RESOURCE], json={"domains": items})
|
||||
|
||||
listed = self.client.domains.list()
|
||||
self.assertList(items, listed)
|
||||
self.assertQueryStringIs("")
|
||||
|
||||
def test_get(self):
|
||||
ref = self.new_ref(email="abc@example.org",
|
||||
id="89acac79-38e7-497d-807c-a011e1310438")
|
||||
|
||||
self.stub_entity("GET", entity=ref, id=ref["id"])
|
||||
|
||||
response = self.client.domains.get(ref["id"])
|
||||
self.assertEqual(ref, response)
|
||||
|
||||
def test_delete(self):
|
||||
ref = self.new_ref(email="abc@example.org",
|
||||
id="89acac79-38e7-497d-807c-a011e1310438")
|
||||
|
||||
self.stub_entity("DELETE", entity=ref, id=ref["id"])
|
||||
|
||||
self.client.domains.delete(ref["id"])
|
||||
self.assertRequestBodyIs(None)
|
||||
|
||||
def test_update(self):
|
||||
ref = self.new_ref(id="89acac79-38e7-497d-807c-a011e1310438")
|
||||
|
||||
self.stub_entity("PUT", entity=ref, id=ref["id"])
|
||||
|
||||
values = ref.copy()
|
||||
|
||||
self.client.domains.update(Domain(values))
|
||||
|
||||
@patch.object(domains.DomainsController, "list_domain_servers")
|
||||
def test_list_domain_servers(self, domains_get):
|
||||
domains_get.return_value = [{"id": "foo", "name": "ns1.example.com."}]
|
||||
|
||||
ref = [{
|
||||
"id": "foo",
|
||||
"name": "ns1.example.com.",
|
||||
}]
|
||||
parts = ["domains", "foo", "servers"]
|
||||
self.stub_url("GET", parts=parts, json={"servers": ref})
|
||||
|
||||
response = self.client.domains.list_domain_servers("foo")
|
||||
self.assertEqual(ref, response)
|
|
@ -1,48 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import quotas
|
||||
|
||||
|
||||
class TestQuota(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
|
||||
@patch.object(quotas.QuotasController, "get")
|
||||
def test_get(self, quota_get):
|
||||
QUOTA = {"domains": 10,
|
||||
"recordset_records": 20,
|
||||
"domain_records": 500,
|
||||
"domain_recordsets": 500}
|
||||
quota_get.return_value = QUOTA
|
||||
response = self.client.quotas.get("foo")
|
||||
self.assertEqual(QUOTA, response)
|
||||
|
||||
@patch.object(quotas.QuotasController, "update")
|
||||
def test_update(self, quota_update):
|
||||
args = mock.MagicMock()
|
||||
args.tenant_id = "1234"
|
||||
args.value = {"domains": 1000}
|
||||
self.client.quotas.update(args.tenant_id, args.value)
|
||||
self.client.quotas.update.assert_called_with(args.tenant_id,
|
||||
args.value)
|
||||
|
||||
@patch.object(quotas.QuotasController, "reset")
|
||||
def test_reset(self, quota_reset):
|
||||
args = mock.MagicMock()
|
||||
args.tenant_id = "1234"
|
||||
self.client.quotas.reset(args.tenant_id)
|
||||
self.client.quotas.reset.assert_called_with("1234")
|
|
@ -1,222 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import uuid
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient import utils
|
||||
from designateclient import warlock
|
||||
|
||||
|
||||
Record = warlock.model_factory(utils.load_schema('v1', 'record'))
|
||||
|
||||
DOMAIN = {
|
||||
"id": str(uuid.uuid4()),
|
||||
"name": "example.com."
|
||||
}
|
||||
|
||||
|
||||
class TestRecords(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
RESOURCE = 'records'
|
||||
|
||||
def new_ref(self, **kwargs):
|
||||
ref = super(TestRecords, self).new_ref(**kwargs)
|
||||
ref.setdefault("name", uuid.uuid4().hex)
|
||||
ref.setdefault("type", "A")
|
||||
ref.setdefault("data", "10.0.0.1")
|
||||
return ref
|
||||
|
||||
def test_create_record(self):
|
||||
ref = self.new_ref(id="2e32e609-3a4f-45ba-bdef-e50eacd345ad")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_AAAA_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778888",
|
||||
type="AAAA",
|
||||
data="2001:db8:0:1234:0:5678:9:12")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_MX_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778989",
|
||||
type="MX",
|
||||
data="mail.example.com.",
|
||||
priority=10)
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_CNAME_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778890",
|
||||
type="CNAME",
|
||||
data="example.com.")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_TXT_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778889",
|
||||
type="TXT",
|
||||
data="This is a TXT record")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_SRV_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778888",
|
||||
type="SRV",
|
||||
data="0 5060 sip.example.com.",
|
||||
priority=30)
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_NS_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677779999",
|
||||
type="NS",
|
||||
data="ns1.example.com.")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_PTR_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778891",
|
||||
type="PTR",
|
||||
data="www.example.com.")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_SPF_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778899",
|
||||
type="SPF",
|
||||
data="v=spf1 +mx a:colo.example.com/28 -all")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_SSHFP_record(self):
|
||||
ref = self.new_ref(id="11112222-3333-4444-5555-666677778888",
|
||||
type="SSHFP",
|
||||
data="2 1 6c3c958af43d953f91f40e0d84157f4fe7b4a898")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("POST", parts=parts, json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.create(DOMAIN['id'], Record(values))
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_get(self):
|
||||
ref = self.new_ref(id="2e32e609-3a4f-45ba-bdef-e50eacd345ad")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_entity("GET", entity=ref, id=ref["id"], parts=parts)
|
||||
|
||||
response = self.client.records.get(DOMAIN["id"], ref["id"])
|
||||
self.assertEqual(ref, response)
|
||||
|
||||
def test_list(self):
|
||||
items = [
|
||||
self.new_ref(id="2e32e609-3a4f-45ba-bdef-e50eacd345ad"),
|
||||
self.new_ref(id="11112222-3333-4444-5555-666677778888")
|
||||
]
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_url("GET", parts=parts, json={"records": items})
|
||||
|
||||
listed = self.client.records.list(DOMAIN["id"])
|
||||
self.assertList(items, listed)
|
||||
self.assertQueryStringIs("")
|
||||
|
||||
def test_update(self):
|
||||
ref = self.new_ref(id="2e32e609-3a4f-45ba-bdef-e50eacd345ad",
|
||||
type="A",
|
||||
data="192.0.2.5")
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_entity("PUT", entity=ref, id=ref["id"], parts=parts)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.records.update(DOMAIN["id"], Record(ref))
|
||||
|
||||
def test_delete(self):
|
||||
ref = self.new_ref()
|
||||
|
||||
parts = ["domains", DOMAIN["id"], self.RESOURCE]
|
||||
self.stub_entity("DELETE", id=ref["id"], parts=parts)
|
||||
|
||||
self.client.records.delete(DOMAIN["id"], ref["id"])
|
||||
self.assertRequestBodyIs(None)
|
|
@ -1,54 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import reports
|
||||
|
||||
|
||||
class TestReports(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
|
||||
@patch.object(reports.ReportsController, "count_all")
|
||||
def test_count_all(self, count_all):
|
||||
self.client.reports.count_all()
|
||||
self.client.reports.count_all.assert_called_with()
|
||||
|
||||
@patch.object(reports.ReportsController, "count_domains")
|
||||
def test_count_domain(self, count_domains):
|
||||
self.client.reports.count_domains()
|
||||
self.client.reports.count_domains.assert_called_once_with()
|
||||
|
||||
@patch.object(reports.ReportsController, "count_tenants")
|
||||
def test_count_tenants(self, count_tenants):
|
||||
self.client.reports.count_tenants()
|
||||
self.client.reports.count_tenants.assert_called_once_with()
|
||||
|
||||
@patch.object(reports.ReportsController, "count_records")
|
||||
def test_count_records(self, count_records):
|
||||
self.client.reports.count_records()
|
||||
self.client.reports.count_records.assert_called_once_with()
|
||||
|
||||
@patch.object(reports.ReportsController, "tenants_all")
|
||||
def test_tenants_all(self, tenants_all):
|
||||
self.client.reports.tenants_all()
|
||||
self.client.reports.tenants_all.assert_called_once_with()
|
||||
|
||||
@patch.object(reports.ReportsController, "tenant_domains")
|
||||
def test_tenant_domains(self, tenant_domains):
|
||||
args = mock.MagicMock()
|
||||
args.other_tenant_id = "uuid"
|
||||
self.client.reports.tenant_domains(args.other_tenant_id)
|
||||
self.client.reports.tenant_domains.assert_called_once_with("uuid")
|
|
@ -1,95 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import uuid
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import servers
|
||||
|
||||
|
||||
class TestServers(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
RESOURCE = 'servers'
|
||||
|
||||
def new_ref(self, **kwargs):
|
||||
ref = super(TestServers, self).new_ref(**kwargs)
|
||||
ref.setdefault("name", uuid.uuid4().hex)
|
||||
return ref
|
||||
|
||||
def test_list(self):
|
||||
items = [
|
||||
self.new_ref(name="ns1.example.org.",
|
||||
id="89acac79-38e7-497d-807c-a011e1310438"),
|
||||
self.new_ref(name="ns2.example.org.",
|
||||
id="89acac79-38e7-497d-807c-a011e1310435")
|
||||
]
|
||||
|
||||
self.stub_url("GET", parts=[self.RESOURCE], json={"servers": items})
|
||||
|
||||
listed = self.client.servers.list()
|
||||
self.assertList(items, listed)
|
||||
self.assertQueryStringIs("")
|
||||
|
||||
def test_get(self):
|
||||
ref = self.new_ref(name="ns1.example.org.",
|
||||
id="89acac79-38e7-497d-807c-a011e1310438")
|
||||
|
||||
self.stub_entity("GET", entity=ref, id=ref["id"])
|
||||
|
||||
response = self.client.servers.get(ref["id"])
|
||||
self.assertEqual(ref, response)
|
||||
|
||||
def test_create(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "ns1.example.org."}
|
||||
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.client.servers.create({"name": "ns1.example.org."})
|
||||
self.assertRequestBodyIs(json=values)
|
||||
|
||||
def test_create_with_name_too_long(self):
|
||||
ref = {"id": "89acac79-38e7-497d-807c-a011e1310438",
|
||||
"name": "ns1." + "foo" * 85 + ".org."}
|
||||
|
||||
self.stub_url("POST", parts=[self.RESOURCE], json=ref)
|
||||
|
||||
values = ref.copy()
|
||||
del values["id"]
|
||||
|
||||
self.assertRaises(ValueError, self.client.servers.create,
|
||||
{"name": "ns1.example.org."})
|
||||
|
||||
@patch.object(servers.ServersController, "update")
|
||||
def test_update(self, server_update):
|
||||
ref = self.new_ref()
|
||||
|
||||
self.stub_entity("PUT", entity=ref, id=ref["id"])
|
||||
|
||||
mock_server = mock.MagicMock()
|
||||
self.client.servers.update(mock_server)
|
||||
self.client.servers.update.assert_called_with(mock_server)
|
||||
|
||||
def test_delete(self):
|
||||
ref = self.new_ref()
|
||||
|
||||
self.stub_entity("DELETE", id=ref["id"])
|
||||
|
||||
self.client.servers.delete(ref["id"])
|
||||
self.assertRequestBodyIs(None)
|
|
@ -1,42 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import sync
|
||||
|
||||
|
||||
class TestSync(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
|
||||
@patch.object(sync.SyncController, "sync_all")
|
||||
def test_sync_all(self, sync_all):
|
||||
self.client.sync.sync_all()
|
||||
self.client.sync.sync_all.assert_called_with()
|
||||
|
||||
@patch.object(sync.SyncController, "sync_domain")
|
||||
def test_sync_domain(self, sync_domain):
|
||||
args = mock.MagicMock()
|
||||
args.tenant_id = "1234"
|
||||
self.client.sync.sync_domain(args.tenant_id)
|
||||
self.client.sync.sync_domain.assert_called_with("1234")
|
||||
|
||||
@patch.object(sync.SyncController, "sync_record")
|
||||
def test_sync_record(self, sync_record):
|
||||
args = mock.MagicMock()
|
||||
args.tenant_id = "1234"
|
||||
args.record_id = "uuid"
|
||||
self.client.sync.sync_record(args.tenant_id, args.record_id)
|
||||
self.client.sync.sync_record.assert_called_with("1234", "uuid")
|
|
@ -1,29 +0,0 @@
|
|||
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
from mock import patch
|
||||
|
||||
from designateclient.tests import test_v1
|
||||
from designateclient.v1 import touch
|
||||
|
||||
|
||||
class TestTouch(test_v1.APIV1TestCase, test_v1.CrudMixin):
|
||||
|
||||
@patch.object(touch.TouchController, "domain")
|
||||
def test_domain(self, domain):
|
||||
args = mock.MagicMock()
|
||||
args.domain_id = "1234"
|
||||
self.client.touch.domain(args.domain_id)
|
||||
self.client.touch.domain.assert_called_with("1234")
|
|
@ -14,47 +14,18 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import os
|
||||
import uuid
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from debtcollector import removals
|
||||
from keystoneauth1 import adapter
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as ks_session
|
||||
from keystoneauth1 import token_endpoint
|
||||
import pkg_resources
|
||||
import six
|
||||
|
||||
from designateclient import exceptions
|
||||
|
||||
|
||||
def resource_string(*args, **kwargs):
|
||||
if len(args) == 0:
|
||||
raise ValueError()
|
||||
|
||||
package = kwargs.pop('package', None)
|
||||
|
||||
if not package:
|
||||
package = 'designateclient'
|
||||
|
||||
resource_path = os.path.join('resources', *args)
|
||||
|
||||
if not pkg_resources.resource_exists(package, resource_path):
|
||||
raise exceptions.ResourceNotFound('Could not find the requested '
|
||||
'resource: %s' % resource_path)
|
||||
|
||||
return pkg_resources.resource_string(package, resource_path)
|
||||
|
||||
|
||||
def load_schema(version, name, package=None):
|
||||
schema_string = resource_string('schemas', version, '%s.json' % name,
|
||||
package=package)
|
||||
|
||||
return jsonutils.loads(schema_string)
|
||||
|
||||
|
||||
def get_item_properties(item, fields, mixed_case_fields=[], formatters={}):
|
||||
"""Return a tuple containing the item properties.
|
||||
|
||||
|
|
|
@ -1,161 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from debtcollector import removals
|
||||
from stevedore import extension
|
||||
|
||||
from designateclient import exceptions
|
||||
from designateclient import utils
|
||||
from designateclient import version
|
||||
|
||||
|
||||
@removals.removed_class(
|
||||
'designateclient.v1.Client',
|
||||
replacement='designateclient.v2.client.Client',
|
||||
message='Designate v1 API is being retired, and the v1 Client class will '
|
||||
'stop functioning. Please update code to the '
|
||||
'designateclient.v2.client.Client class. The API is deprecated',
|
||||
version='2.2.0',
|
||||
removal_version='?',
|
||||
stacklevel=3)
|
||||
class Client(object):
|
||||
"""Client for the Designate v1 API"""
|
||||
|
||||
def __init__(self, endpoint=None, username=None, user_id=None,
|
||||
user_domain_id=None, user_domain_name=None, password=None,
|
||||
tenant_name=None, tenant_id=None, domain_name=None,
|
||||
domain_id=None, project_name=None,
|
||||
project_id=None, project_domain_name=None,
|
||||
project_domain_id=None, auth_url=None, token=None,
|
||||
endpoint_type='publicURL', region_name=None,
|
||||
service_type='dns', insecure=False, session=None,
|
||||
cacert=None, all_tenants=None, edit_managed=None,
|
||||
timeout=None):
|
||||
"""
|
||||
:param endpoint: Endpoint URL
|
||||
:param token: A token instead of username / password
|
||||
:param insecure: Allow "insecure" HTTPS requests
|
||||
"""
|
||||
|
||||
if endpoint:
|
||||
endpoint = endpoint.rstrip('/')
|
||||
if not endpoint.endswith('v1'):
|
||||
endpoint = "%s/v1" % endpoint
|
||||
|
||||
# Compatibility code to mimic the old behaviour of the client
|
||||
if session is None:
|
||||
session = utils.get_session(
|
||||
auth_url=auth_url,
|
||||
endpoint=endpoint,
|
||||
domain_id=domain_id,
|
||||
domain_name=domain_name,
|
||||
project_id=project_id or tenant_id,
|
||||
project_name=project_name or tenant_name,
|
||||
project_domain_name=project_domain_name,
|
||||
project_domain_id=project_domain_id,
|
||||
username=username,
|
||||
user_id=user_id,
|
||||
password=password,
|
||||
user_domain_id=user_domain_id,
|
||||
user_domain_name=user_domain_name,
|
||||
token=token,
|
||||
insecure=insecure,
|
||||
cacert=cacert,
|
||||
)
|
||||
|
||||
# NOTE: all_tenants and edit_managed are pulled from the session for
|
||||
# backwards compat reasons, do not pull additional modifiers from
|
||||
# here. Once removed, the kwargs above should default to False.
|
||||
if all_tenants is None:
|
||||
self.all_tenants = getattr(session, 'all_tenants', False)
|
||||
else:
|
||||
self.all_tenants = all_tenants
|
||||
|
||||
if edit_managed is None:
|
||||
self.edit_managed = getattr(session, 'edit_managed', False)
|
||||
else:
|
||||
self.edit_managed = edit_managed
|
||||
|
||||
# Since we have to behave nicely like a legacy client/bindings we use
|
||||
# an adapter around the session to not modify it's state.
|
||||
interface = endpoint_type.rstrip('URL')
|
||||
|
||||
self.session = utils.AdapterWithTimeout(
|
||||
session,
|
||||
auth=session.auth,
|
||||
endpoint_override=endpoint,
|
||||
region_name=region_name,
|
||||
service_type=service_type,
|
||||
interface=interface,
|
||||
user_agent='python-designateclient-%s' % version.version_info,
|
||||
version='1',
|
||||
timeout=timeout,
|
||||
)
|
||||
|
||||
def _load_controller(ext):
|
||||
controller = ext.plugin(client=self)
|
||||
setattr(self, ext.name, controller)
|
||||
|
||||
# Load all controllers
|
||||
mgr = extension.ExtensionManager('designateclient.v1.controllers')
|
||||
mgr.map(_load_controller)
|
||||
|
||||
def wrap_api_call(self, func, *args, **kw):
|
||||
"""
|
||||
Wrap a self.<rest function> with exception handling
|
||||
|
||||
:param func: The function to wrap
|
||||
"""
|
||||
kw['raise_exc'] = False
|
||||
kw.setdefault('headers', {})
|
||||
kw['headers'].setdefault('Content-Type', 'application/json')
|
||||
if self.all_tenants:
|
||||
kw['headers'].update({'X-Auth-All-Projects': 'true'})
|
||||
if self.edit_managed:
|
||||
kw['headers'].update({'X-Designate-Edit-Managed-Records': 'true'})
|
||||
|
||||
# Trigger the request
|
||||
response = func(*args, **kw)
|
||||
|
||||
# Decode is response, if possible
|
||||
try:
|
||||
response_payload = response.json()
|
||||
except ValueError:
|
||||
response_payload = {}
|
||||
|
||||
if response.status_code == 400:
|
||||
raise exceptions.BadRequest(**response_payload)
|
||||
elif response.status_code in (401, 403, 413):
|
||||
raise exceptions.Forbidden(**response_payload)
|
||||
elif response.status_code == 404:
|
||||
raise exceptions.NotFound(**response_payload)
|
||||
elif response.status_code == 409:
|
||||
raise exceptions.Conflict(**response_payload)
|
||||
elif response.status_code >= 500:
|
||||
raise exceptions.Unknown(**response_payload)
|
||||
else:
|
||||
return response
|
||||
|
||||
def get(self, path, **kw):
|
||||
return self.wrap_api_call(self.session.get, path, **kw)
|
||||
|
||||
def post(self, path, **kw):
|
||||
return self.wrap_api_call(self.session.post, path, **kw)
|
||||
|
||||
def put(self, path, **kw):
|
||||
return self.wrap_api_call(self.session.put, path, **kw)
|
||||
|
||||
def delete(self, path, **kw):
|
||||
return self.wrap_api_call(self.session.delete, path, **kw)
|
|
@ -1,27 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from designateclient import client
|
||||
|
||||
|
||||
class DiagnosticsController(client.Controller):
|
||||
def ping(self, service, host):
|
||||
"""
|
||||
Ping a service on a given host
|
||||
"""
|
||||
response = self.client.get('/diagnostics/ping/%s/%s' %
|
||||
(service, host))
|
||||
|
||||
return response.json()
|
|
@ -1,93 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from designateclient import client
|
||||
from designateclient import utils
|
||||
from designateclient import warlock
|
||||
|
||||
|
||||
Domain = warlock.model_factory(utils.load_schema('v1', 'domain'))
|
||||
Server = warlock.model_factory(utils.load_schema('v1', 'server'))
|
||||
|
||||
|
||||
class DomainsController(client.CrudController):
|
||||
def list(self):
|
||||
"""
|
||||
Retrieve a list of domains
|
||||
|
||||
:returns: A list of :class:`Domain`
|
||||
"""
|
||||
response = self.client.get('/domains')
|
||||
|
||||
return [Domain(i) for i in response.json()['domains']]
|
||||
|
||||
def get(self, domain_id):
|
||||
"""
|
||||
Retrieve a domain
|
||||
|
||||
:param domain_id: Domain Identifier
|
||||
:returns: :class:`Domain`
|
||||
"""
|
||||
response = self.client.get('/domains/%s' % domain_id)
|
||||
|
||||
return Domain(response.json())
|
||||
|
||||
def create(self, domain):
|
||||
"""
|
||||
Create a domain
|
||||
|
||||
:param domain: A :class:`Domain` to create
|
||||
:returns: :class:`Domain`
|
||||
"""
|
||||
response = self.client.post('/domains', data=jsonutils.dumps(domain))
|
||||
|
||||
return Domain(response.json())
|
||||
|
||||
def update(self, domain):
|
||||
"""
|
||||
Update a domain
|
||||
|
||||
:param domain: A :class:`Domain` to update
|
||||
:returns: :class:`Domain`
|
||||
"""
|
||||
response = self.client.put('/domains/%s' % domain.id,
|
||||
data=jsonutils.dumps(domain.changes))
|
||||
|
||||
return Domain(response.json())
|
||||
|
||||
def delete(self, domain):
|
||||
"""
|
||||
Delete a domain
|
||||
|
||||
:param domain: A :class:`Domain`, or Domain Identifier to delete
|
||||
"""
|
||||
if isinstance(domain, Domain):
|
||||
self.client.delete('/domains/%s' % domain.id)
|
||||
else:
|
||||
self.client.delete('/domains/%s' % domain)
|
||||
|
||||
def list_domain_servers(self, domain_id):
|
||||
"""
|
||||
Retrieve the list of nameservers for a domain
|
||||
|
||||
:param domain_id: Domain Identifier
|
||||
:returns: A list of :class:`Server`
|
||||
"""
|
||||
response = self.client.get('/domains/%s/servers' % domain_id)
|
||||
|
||||
return [Server(i) for i in response.json()['servers']]
|
|
@ -1,39 +0,0 @@
|
|||
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# Author: Endre Karlson <endre.karlson@hp.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from designateclient import client
|
||||
|
||||
|
||||
class QuotasController(client.Controller):
|
||||
def get(self, tenant_id):
|
||||
"""
|
||||
Ping a service on a given host
|
||||
"""
|
||||
response = self.client.get('/quotas/%s' % tenant_id)
|
||||
|
||||
return response.json()
|
||||
|
||||
def update(self, tenant_id, values):
|
||||
response = self.client.put('/quotas/%s' % tenant_id,
|
||||
data=jsonutils.dumps(values))
|
||||
return response.json()
|
||||
|
||||
def reset(self, tenant_id):
|
||||
response = self.client.delete('/quotas/%s' % tenant_id)
|
||||
|
||||
return response
|
|
@ -1,115 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from designateclient import client
|
||||
from designateclient import utils
|
||||
from designateclient.v1.domains import Domain
|
||||
from designateclient import warlock
|
||||
|
||||
|
||||
Record = warlock.model_factory(utils.load_schema('v1', 'record'))
|
||||
|
||||
|
||||
class RecordsController(client.CrudController):
|
||||
def list(self, domain):
|
||||
"""
|
||||
Retrieve a list of records
|
||||
|
||||
:param domain: :class:`Domain` or Domain Identifier
|
||||
:returns: A list of :class:`Record`
|
||||
"""
|
||||
domain_id = domain.id if isinstance(domain, Domain) else domain
|
||||
|
||||
response = self.client.get('/domains/%(domain_id)s/records' % {
|
||||
'domain_id': domain_id
|
||||
})
|
||||
|
||||
return [Record(i) for i in response.json()['records']]
|
||||
|
||||
def get(self, domain, record_id):
|
||||
"""
|
||||
Retrieve a record
|
||||
|
||||
:param domain: :class:`Domain` or Domain Identifier
|
||||
:param record_id: Record Identifier
|
||||
:returns: :class:`Record`
|
||||
"""
|
||||
domain_id = domain.id if isinstance(domain, Domain) else domain
|
||||
|
||||
uri = '/domains/%(domain_id)s/records/%(record_id)s' % {
|
||||
'domain_id': domain_id,
|
||||
'record_id': record_id
|
||||
}
|
||||
|
||||
response = self.client.get(uri)
|
||||
|
||||
return Record(response.json())
|
||||
|
||||
def create(self, domain, record):
|
||||
"""
|
||||
Create a record
|
||||
|
||||
:param domain: :class:`Domain` or Domain Identifier
|
||||
:param record: A :class:`Record` to create
|
||||
:returns: :class:`Record`
|
||||
"""
|
||||
domain_id = domain.id if isinstance(domain, Domain) else domain
|
||||
|
||||
uri = '/domains/%(domain_id)s/records' % {
|
||||
'domain_id': domain_id
|
||||
}
|
||||
|
||||
response = self.client.post(uri, data=jsonutils.dumps(record))
|
||||
|
||||
return Record(response.json())
|
||||
|
||||
def update(self, domain, record):
|
||||
"""
|
||||
Update a record
|
||||
|
||||
:param domain: :class:`Domain` or Domain Identifier
|
||||
:param record: A :class:`Record` to update
|
||||
:returns: :class:`Record`
|
||||
"""
|
||||
domain_id = domain.id if isinstance(domain, Domain) else domain
|
||||
|
||||
uri = '/domains/%(domain_id)s/records/%(record_id)s' % {
|
||||
'domain_id': domain_id,
|
||||
'record_id': record.id
|
||||
}
|
||||
|
||||
response = self.client.put(uri, data=jsonutils.dumps(record.changes))
|
||||
|
||||
return Record(response.json())
|
||||
|
||||
def delete(self, domain, record):
|
||||
"""
|
||||
Delete a record
|
||||
|
||||
:param domain: :class:`Domain` or Domain Identifier
|
||||
:param record: A :class:`Record`, or Record Identifier to delete
|
||||
"""
|
||||
domain_id = domain.id if isinstance(domain, Domain) else domain
|
||||
record_id = record.id if isinstance(record, Record) else record
|
||||
|
||||
uri = '/domains/%(domain_id)s/records/%(record_id)s' % {
|
||||
'domain_id': domain_id,
|
||||
'record_id': record_id
|
||||
}
|
||||
|
||||
self.client.delete(uri)
|
|
@ -1,67 +0,0 @@
|
|||
# Copyright 2013 Hewlett-Packard Development Company, L.P. All Rights Reserved.
|
||||
#
|
||||
# Author: Patrick Galbraith <patg@patg.net>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from designateclient import client
|
||||
|
||||
|
||||
class ReportsController(client.Controller):
|
||||
def count_all(self):
|
||||
"""
|
||||
Domain, Records and tenant total count
|
||||
"""
|
||||
response = self.client.get('/reports/counts')
|
||||
|
||||
return response.json()
|
||||
|
||||
def count_domains(self):
|
||||
"""
|
||||
Domain total count
|
||||
"""
|
||||
response = self.client.get('/reports/counts/domains')
|
||||
|
||||
return response.json()
|
||||
|
||||
def count_tenants(self):
|
||||
"""
|
||||
Tenant total count
|
||||
"""
|
||||
response = self.client.get('/reports/counts/tenants')
|
||||
|
||||
return response.json()
|
||||
|
||||
def count_records(self):
|
||||
"""
|
||||
Record total count
|
||||
"""
|
||||
response = self.client.get('/reports/counts/records')
|
||||
|
||||
return response.json()
|
||||
|
||||
def tenants_all(self):
|
||||
"""
|
||||
Per tenant count
|
||||
"""
|
||||
response = self.client.get('/reports/tenants')
|
||||
|
||||
return response.json()['tenants']
|
||||
|
||||
def tenant_domains(self, other_tenant_id):
|
||||
"""
|
||||
Tenant's domain count
|
||||
"""
|
||||
response = self.client.get('/reports/tenants/%s' %
|
||||
other_tenant_id)
|
||||
|
||||
return [{'domain': d} for d in response.json()['domains']]
|
|
@ -1,81 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from designateclient import client
|
||||
from designateclient import utils
|
||||
from designateclient import warlock
|
||||
|
||||
|
||||
Server = warlock.model_factory(utils.load_schema('v1', 'server'))
|
||||
|
||||
|
||||
class ServersController(client.CrudController):
|
||||
def list(self):
|
||||
"""
|
||||
Retrieve a list of servers
|
||||
|
||||
:returns: A list of :class:`Server`
|
||||
"""
|
||||
response = self.client.get('/servers')
|
||||
|
||||
return [Server(i) for i in response.json()['servers']]
|
||||
|
||||
def get(self, server_id):
|
||||
"""
|
||||
Retrieve a server
|
||||
|
||||
:param server_id: Server Identifier
|
||||
:returns: :class:`Server`
|
||||
"""
|
||||
response = self.client.get('/servers/%s' % server_id)
|
||||
|
||||
return Server(response.json())
|
||||
|
||||
def create(self, server):
|
||||
"""
|
||||
Create a server
|
||||
|
||||
:param server: A :class:`Server` to create
|
||||
:returns: :class:`Server`
|
||||
"""
|
||||
response = self.client.post('/servers', data=jsonutils.dumps(server))
|
||||
|
||||
return Server(response.json())
|
||||
|
||||
def update(self, server):
|
||||
"""
|
||||
Update a server
|
||||
|
||||
:param server: A :class:`Server` to update
|
||||
:returns: :class:`Server`
|
||||
"""
|
||||
response = self.client.put('/servers/%s' % server.id,
|
||||
data=jsonutils.dumps(server.changes))
|
||||
|
||||
return Server(response.json())
|
||||
|
||||
def delete(self, server):
|
||||
"""
|
||||
Delete a server
|
||||
|
||||
:param server: A :class:`Server`, or Server Identifier to delete
|
||||
"""
|
||||
if isinstance(server, Server):
|
||||
self.client.delete('/servers/%s' % server.id)
|
||||
else:
|
||||
self.client.delete('/servers/%s' % server)
|
|
@ -1,37 +0,0 @@
|
|||
# Copyright 2012 Managed I.T.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from designateclient import client
|
||||
|
||||
|
||||
class SyncController(client.Controller):
|
||||
def sync_all(self):
|
||||
"""
|
||||
Sync Everything
|
||||
"""
|
||||
self.client.post('/domains/sync')
|
||||
|
||||
def sync_domain(self, domain_id):
|
||||
"""
|
||||
Sync Single Domain
|
||||
"""
|
||||
self.client.post('/domains/%s/sync' % domain_id)
|
||||
|
||||
def sync_record(self, domain_id, record_id):
|
||||
"""
|
||||
Sync Single Record
|
||||
"""
|
||||
self.client.post('/domains/%s/records/%s/sync' %
|
||||
(domain_id, record_id))
|
|
@ -1,24 +0,0 @@
|
|||
# Copyright 2013 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# Author: Kiall Mac Innes <kiall@hp.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from designateclient import client
|
||||
|
||||
|
||||
class TouchController(client.Controller):
|
||||
def domain(self, domain_id):
|
||||
"""
|
||||
Touch a single Domain
|
||||
"""
|
||||
self.client.post('/domains/%s/touch' % domain_id)
|
|
@ -1,9 +1,9 @@
|
|||
from __future__ import print_function
|
||||
import logging
|
||||
import os
|
||||
|
||||
from designateclient.v2 import client
|
||||
from designateclient import exceptions
|
||||
from designateclient import shell
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
@ -17,10 +17,10 @@ Example script to create or get a domain and add some records to it.
|
|||
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import logging
|
||||
import os
|
||||
|
||||
from designateclient.v2 import client
|
||||
from designateclient import exceptions
|
||||
from designateclient import shell
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
@ -11,10 +11,10 @@ from keystoneauth1 import session as keystone_session
|
|||
logging.basicConfig(level='DEBUG')
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
from __future__ import print_function
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
from designateclient import exceptions
|
||||
from designateclient import shell
|
||||
from designateclient.v2 import client
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
|
@ -13,10 +13,10 @@ from keystoneauth1 import session as keystone_session
|
|||
logging.basicConfig(level='DEBUG')
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -1,21 +1,20 @@
|
|||
import logging
|
||||
import os
|
||||
import uuid
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
||||
from designateclient import exceptions
|
||||
from designateclient import shell
|
||||
from designateclient.v2 import client
|
||||
|
||||
|
||||
logging.basicConfig(level='DEBUG')
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
import logging
|
||||
import os
|
||||
import uuid
|
||||
|
||||
from designateclient.v2 import client
|
||||
from designateclient import shell
|
||||
from designateclient import utils
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
@ -12,10 +11,10 @@ from keystoneauth1 import session as keystone_session
|
|||
logging.basicConfig(level='DEBUG')
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
from __future__ import print_function
|
||||
import logging
|
||||
import os
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
||||
from designateclient import shell
|
||||
from designateclient.v2 import client
|
||||
|
||||
logging.basicConfig(level='DEBUG')
|
||||
|
||||
auth = generic.Password(
|
||||
auth_url=shell.env('OS_AUTH_URL'),
|
||||
username=shell.env('OS_USERNAME'),
|
||||
password=shell.env('OS_PASSWORD'),
|
||||
project_name=shell.env('OS_PROJECT_NAME'),
|
||||
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||
username=os.environ.get('OS_USERNAME'),
|
||||
password=os.environ.get('OS_PASSWORD'),
|
||||
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
|
|
|
@ -3,4 +3,5 @@
|
|||
# process, which may cause wedges in the gate later.
|
||||
sphinx!=1.6.6,!=1.6.7,>=1.6.2,<2.0.0;python_version=='2.7' # BSD
|
||||
sphinx!=1.6.6,!=1.6.7,>=1.6.2;python_version>='3.4' # BSD
|
||||
reno>=2.7.0 # Apache-2.0
|
||||
openstackdocstheme>=1.18.1 # Apache-2.0
|
||||
|
|
|
@ -1,958 +0,0 @@
|
|||
.. ###################################################
|
||||
.. ## WARNING ######################################
|
||||
.. ############## WARNING ##########################
|
||||
.. ########################## WARNING ##############
|
||||
.. ###################################### WARNING ##
|
||||
.. ###################################################
|
||||
.. ###################################################
|
||||
.. ##
|
||||
.. This file is tool-generated. Do not edit manually.
|
||||
.. http://docs.openstack.org/contributor-guide/
|
||||
.. doc-tools/cli-reference.html
|
||||
.. ##
|
||||
.. ## WARNING ######################################
|
||||
.. ############## WARNING ##########################
|
||||
.. ########################## WARNING ##############
|
||||
.. ###################################### WARNING ##
|
||||
.. ###################################################
|
||||
|
||||
===========================================
|
||||
DNS service (designate) command-line client
|
||||
===========================================
|
||||
|
||||
The designate client is the command-line interface (CLI) for
|
||||
the DNS service (designate) API and its extensions.
|
||||
|
||||
This chapter documents :command:`designate` version ``2.6.0``.
|
||||
|
||||
For help on a specific :command:`designate` command, enter:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ designate help COMMAND
|
||||
|
||||
.. _designate_command_usage:
|
||||
|
||||
designate usage
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate [--version] [-v | -q] [--log-file LOG_FILE] [-h] [--debug]
|
||||
[--os-username OS_USERNAME] [--os-user-id OS_USER_ID]
|
||||
[--os-user-domain-id OS_USER_DOMAIN_ID]
|
||||
[--os-user-domain-name OS_USER_DOMAIN_NAME]
|
||||
[--os-password OS_PASSWORD] [--os-tenant-name OS_TENANT_NAME]
|
||||
[--os-tenant-id OS_TENANT_ID]
|
||||
[--os-project-name OS_PROJECT_NAME]
|
||||
[--os-domain-name OS_DOMAIN_NAME]
|
||||
[--os-domain-id OS_DOMAIN_ID] [--os-project-id OS_PROJECT_ID]
|
||||
[--os-project-domain-id OS_PROJECT_DOMAIN_ID]
|
||||
[--os-project-domain-name OS_PROJECT_DOMAIN_NAME]
|
||||
[--os-auth-url OS_AUTH_URL] [--os-region-name OS_REGION_NAME]
|
||||
[--os-token OS_TOKEN] [--os-endpoint OS_ENDPOINT]
|
||||
[--os-endpoint-type OS_ENDPOINT_TYPE]
|
||||
[--os-service-type OS_SERVICE_TYPE] [--os-cacert OS_CACERT]
|
||||
[--insecure] [--all-tenants] [--edit-managed]
|
||||
|
||||
.. _designate_command_options:
|
||||
|
||||
designate optional arguments
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
``--version``
|
||||
show program's version number and exit
|
||||
|
||||
``-v, --verbose``
|
||||
Increase verbosity of output. Can be repeated.
|
||||
|
||||
``-q, --quiet``
|
||||
Suppress output except warnings and errors.
|
||||
|
||||
``--log-file LOG_FILE``
|
||||
Specify a file to log output. Disabled by default.
|
||||
|
||||
``-h, --help``
|
||||
Show help message and exit.
|
||||
|
||||
``--debug``
|
||||
Show tracebacks on errors.
|
||||
|
||||
``--os-username OS_USERNAME``
|
||||
Name used for authentication with the OpenStack
|
||||
Identity service. Defaults to ``env[OS_USERNAME]``.
|
||||
|
||||
``--os-user-id OS_USER_ID``
|
||||
User ID used for authentication with the OpenStack
|
||||
Identity service. Defaults to ``env[OS_USER_ID]``.
|
||||
|
||||
``--os-user-domain-id OS_USER_DOMAIN_ID``
|
||||
Defaults to ``env[OS_USER_DOMAIN_ID]``.
|
||||
|
||||
``--os-user-domain-name OS_USER_DOMAIN_NAME``
|
||||
Defaults to ``env[OS_USER_DOMAIN_NAME]``.
|
||||
|
||||
``--os-password OS_PASSWORD``
|
||||
Password used for authentication with the OpenStack
|
||||
Identity service. Defaults to ``env[OS_PASSWORD]``.
|
||||
|
||||
``--os-tenant-name OS_TENANT_NAME``
|
||||
Tenant to request authorization on. Defaults to
|
||||
``env[OS_TENANT_NAME]``.
|
||||
|
||||
``--os-tenant-id OS_TENANT_ID``
|
||||
Tenant to request authorization on. Defaults to
|
||||
``env[OS_TENANT_ID]``.
|
||||
|
||||
``--os-project-name OS_PROJECT_NAME``
|
||||
Project to request authorization on. Defaults to
|
||||
``env[OS_PROJECT_NAME]``.
|
||||
|
||||
``--os-domain-name OS_DOMAIN_NAME``
|
||||
Project to request authorization on. Defaults to
|
||||
``env[OS_DOMAIN_NAME]``.
|
||||
|
||||
``--os-domain-id OS_DOMAIN_ID``
|
||||
Defaults to ``env[OS_DOMAIN_ID]``.
|
||||
|
||||
``--os-project-id OS_PROJECT_ID``
|
||||
Project to request authorization on. Defaults to
|
||||
``env[OS_PROJECT_ID]``.
|
||||
|
||||
``--os-project-domain-id OS_PROJECT_DOMAIN_ID``
|
||||
Defaults to ``env[OS_PROJECT_DOMAIN_ID]``.
|
||||
|
||||
``--os-project-domain-name OS_PROJECT_DOMAIN_NAME``
|
||||
Defaults to ``env[OS_PROJECT_DOMAIN_NAME]``.
|
||||
|
||||
``--os-auth-url OS_AUTH_URL``
|
||||
Specify the Identity endpoint to use for
|
||||
authentication. Defaults to ``env[OS_AUTH_URL]``.
|
||||
|
||||
``--os-region-name OS_REGION_NAME``
|
||||
Specify the region to use. Defaults to
|
||||
``env[OS_REGION_NAME]``.
|
||||
|
||||
``--os-token OS_TOKEN``
|
||||
Specify an existing token to use instead of retrieving
|
||||
one via authentication (e.g. with username &
|
||||
password). Defaults to ``env[OS_SERVICE_TOKEN]``.
|
||||
|
||||
``--os-endpoint OS_ENDPOINT``
|
||||
Specify an endpoint to use instead of retrieving one
|
||||
from the service catalog (via authentication).
|
||||
Defaults to ``env[OS_DNS_ENDPOINT]``.
|
||||
|
||||
``--os-endpoint-type OS_ENDPOINT_TYPE``
|
||||
Defaults to ``env[OS_ENDPOINT_TYPE]``.
|
||||
|
||||
``--os-service-type OS_SERVICE_TYPE``
|
||||
Defaults to ``env[OS_DNS_SERVICE_TYPE]``, or 'dns'.
|
||||
|
||||
``--os-cacert OS_CACERT``
|
||||
CA certificate bundle file. Defaults to
|
||||
``env[OS_CACERT]``.
|
||||
|
||||
``--insecure``
|
||||
Explicitly allow 'insecure' SSL requests.
|
||||
|
||||
``--all-tenants``
|
||||
Allows to list all domains from all tenants.
|
||||
|
||||
``--edit-managed``
|
||||
Allows to edit records that are marked as managed.
|
||||
|
||||
.. _designate_diagnostics-ping:
|
||||
|
||||
designate diagnostics-ping
|
||||
--------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate diagnostics-ping [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--prefix PREFIX] --service SERVICE --host
|
||||
HOST
|
||||
|
||||
Ping a service on a given host
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--service SERVICE``
|
||||
Service name (e.g. central)
|
||||
|
||||
``--host HOST``
|
||||
Hostname
|
||||
|
||||
.. _designate_domain-create:
|
||||
|
||||
designate domain-create
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-create [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
--name NAME --email EMAIL [--ttl TTL]
|
||||
[--description DESCRIPTION]
|
||||
|
||||
Create Domain
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Domain name.
|
||||
|
||||
``--email EMAIL``
|
||||
Domain email.
|
||||
|
||||
``--ttl TTL``
|
||||
Time to live (seconds).
|
||||
|
||||
``--description DESCRIPTION``
|
||||
Description.
|
||||
|
||||
.. _designate_domain-delete:
|
||||
|
||||
designate domain-delete
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-delete [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
id
|
||||
|
||||
Delete Domain
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_domain-get:
|
||||
|
||||
designate domain-get
|
||||
--------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-get [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
id
|
||||
|
||||
Get Domain
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_domain-list:
|
||||
|
||||
designate domain-list
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-list [-h] [-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
|
||||
List Domains
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_domain-servers-list:
|
||||
|
||||
designate domain-servers-list
|
||||
-----------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-servers-list [-h]
|
||||
[-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
id
|
||||
|
||||
List Domain Servers
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_domain-update:
|
||||
|
||||
designate domain-update
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate domain-update [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
[--name NAME] [--email EMAIL] [--ttl TTL]
|
||||
[--description DESCRIPTION | --no-description]
|
||||
id
|
||||
|
||||
Update Domain
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Domain name.
|
||||
|
||||
``--email EMAIL``
|
||||
Domain email.
|
||||
|
||||
``--ttl TTL``
|
||||
Time to live (seconds).
|
||||
|
||||
``--description DESCRIPTION``
|
||||
Description.
|
||||
|
||||
``--no-description``
|
||||
|
||||
.. _designate_quota-get:
|
||||
|
||||
designate quota-get
|
||||
-------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate quota-get [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>] [--print-empty]
|
||||
[--noindent] [--prefix PREFIX]
|
||||
tenant_id
|
||||
|
||||
Get Quota
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``tenant_id``
|
||||
Tenant ID
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_quota-reset:
|
||||
|
||||
designate quota-reset
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate quota-reset [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
tenant_id
|
||||
|
||||
Reset Quota
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``tenant_id``
|
||||
Tenant ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_quota-update:
|
||||
|
||||
designate quota-update
|
||||
----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate quota-update [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
[--domains DOMAINS]
|
||||
[--domain-recordsets DOMAIN_RECORDSETS]
|
||||
[--recordset-records RECORDSET_RECORDS]
|
||||
[--domain-records DOMAIN_RECORDS]
|
||||
[--api-export-size API_EXPORT_SIZE]
|
||||
tenant_id
|
||||
|
||||
Update Quota
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``tenant_id``
|
||||
Tenant ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--domains DOMAINS``
|
||||
Allowed domains.
|
||||
|
||||
``--domain-recordsets DOMAIN_RECORDSETS``
|
||||
Allowed domain records.
|
||||
|
||||
``--recordset-records RECORDSET_RECORDS``
|
||||
Allowed recordset records.
|
||||
|
||||
``--domain-records DOMAIN_RECORDS``
|
||||
Allowed domain records.
|
||||
|
||||
``--api-export-size API_EXPORT_SIZE``
|
||||
Allowed zone export recordsets.
|
||||
|
||||
.. _designate_record-create:
|
||||
|
||||
designate record-create
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate record-create [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
--name NAME --type TYPE --data DATA [--ttl TTL]
|
||||
[--priority PRIORITY]
|
||||
[--description DESCRIPTION]
|
||||
domain_id
|
||||
|
||||
Create Record
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Record (relative|absolute) name.
|
||||
|
||||
``--type TYPE``
|
||||
Record type.
|
||||
|
||||
``--data DATA``
|
||||
Record data.
|
||||
|
||||
``--ttl TTL``
|
||||
Record TTL.
|
||||
|
||||
``--priority PRIORITY``
|
||||
Record priority.
|
||||
|
||||
``--description DESCRIPTION``
|
||||
Description.
|
||||
|
||||
.. _designate_record-delete:
|
||||
|
||||
designate record-delete
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate record-delete [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
domain_id id
|
||||
|
||||
Delete Record
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID or name.
|
||||
|
||||
``id``
|
||||
Record ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_record-get:
|
||||
|
||||
designate record-get
|
||||
--------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate record-get [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
domain_id id
|
||||
|
||||
Get Record
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID or name.
|
||||
|
||||
``id``
|
||||
Record ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_record-list:
|
||||
|
||||
designate record-list
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate record-list [-h] [-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
domain_id
|
||||
|
||||
List Records
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID or name.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_record-update:
|
||||
|
||||
designate record-update
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate record-update [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
[--name NAME] [--type TYPE] [--data DATA]
|
||||
[--description DESCRIPTION | --no-description]
|
||||
[--ttl TTL | --no-ttl]
|
||||
[--priority PRIORITY | --no-priority]
|
||||
domain_id id
|
||||
|
||||
Update Record
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID or name.
|
||||
|
||||
``id``
|
||||
Record ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Record name.
|
||||
|
||||
``--type TYPE``
|
||||
Record type.
|
||||
|
||||
``--data DATA``
|
||||
Record data.
|
||||
|
||||
``--description DESCRIPTION``
|
||||
Description.
|
||||
|
||||
``--no-description``
|
||||
|
||||
``--ttl TTL``
|
||||
Record time to live (seconds).
|
||||
|
||||
``--no-ttl``
|
||||
|
||||
``--priority PRIORITY``
|
||||
Record priority.
|
||||
|
||||
``--no-priority``
|
||||
|
||||
.. _designate_report-count-all:
|
||||
|
||||
designate report-count-all
|
||||
--------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-count-all [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--prefix PREFIX]
|
||||
|
||||
Get count totals for all tenants, domains and records
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_report-count-domains:
|
||||
|
||||
designate report-count-domains
|
||||
------------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-count-domains [-h]
|
||||
[-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--prefix PREFIX]
|
||||
|
||||
Get counts for total domains
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_report-count-records:
|
||||
|
||||
designate report-count-records
|
||||
------------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-count-records [-h]
|
||||
[-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--prefix PREFIX]
|
||||
|
||||
Get counts for total records
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_report-count-tenants:
|
||||
|
||||
designate report-count-tenants
|
||||
------------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-count-tenants [-h]
|
||||
[-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--prefix PREFIX]
|
||||
|
||||
Get counts for total tenants
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_report-tenant-domains:
|
||||
|
||||
designate report-tenant-domains
|
||||
-------------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-tenant-domains [-h]
|
||||
[-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
--report-tenant-id REPORT_TENANT_ID
|
||||
|
||||
Get a list of domains for given tenant
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--report-tenant-id REPORT_TENANT_ID``
|
||||
The tenant_id being reported on.
|
||||
|
||||
.. _designate_report-tenants-all:
|
||||
|
||||
designate report-tenants-all
|
||||
----------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate report-tenants-all [-h] [-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
|
||||
Get list of tenants and domain count for each
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_server-create:
|
||||
|
||||
designate server-create
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate server-create [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
--name NAME
|
||||
|
||||
Create Server
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Server name.
|
||||
|
||||
.. _designate_server-delete:
|
||||
|
||||
designate server-delete
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate server-delete [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
id
|
||||
|
||||
Delete Server
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Server ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_server-get:
|
||||
|
||||
designate server-get
|
||||
--------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate server-get [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
id
|
||||
|
||||
Get Server
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Server ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_server-list:
|
||||
|
||||
designate server-list
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate server-list [-h] [-f {csv,html,json,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent]
|
||||
[--quote {all,minimal,none,nonnumeric}]
|
||||
|
||||
List Servers
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_server-update:
|
||||
|
||||
designate server-update
|
||||
-----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate server-update [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
[--name NAME]
|
||||
id
|
||||
|
||||
Update Server
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``id``
|
||||
Server ID.
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
``--name NAME``
|
||||
Server name.
|
||||
|
||||
.. _designate_sync-all:
|
||||
|
||||
designate sync-all
|
||||
------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate sync-all [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>] [--print-empty]
|
||||
[--noindent] [--prefix PREFIX]
|
||||
|
||||
Sync Everything
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_sync-domain:
|
||||
|
||||
designate sync-domain
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate sync-domain [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
domain_id
|
||||
|
||||
Sync a single Domain
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_sync-record:
|
||||
|
||||
designate sync-record
|
||||
---------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate sync-record [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
domain_id record_id
|
||||
|
||||
Sync a single Record
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID
|
||||
|
||||
``record_id``
|
||||
Record ID
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
||||
.. _designate_touch-domain:
|
||||
|
||||
designate touch-domain
|
||||
----------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
usage: designate touch-domain [-h] [-f {html,json,shell,table,value,yaml}]
|
||||
[-c COLUMN] [--max-width <integer>]
|
||||
[--print-empty] [--noindent] [--prefix PREFIX]
|
||||
domain_id
|
||||
|
||||
Touch a single Domain
|
||||
|
||||
**Positional arguments:**
|
||||
|
||||
``domain_id``
|
||||
Domain ID
|
||||
|
||||
**Optional arguments:**
|
||||
|
||||
``-h, --help``
|
||||
show this help message and exit
|
||||
|
|
@ -30,4 +30,3 @@ Branch, work, & submit:
|
|||
git rebase -i
|
||||
# submit
|
||||
git-review
|
||||
|
||||
|
|
|
@ -2,28 +2,14 @@
|
|||
python-designateclient
|
||||
======================
|
||||
|
||||
python-designateclient provides python bindings and command line tools for both
|
||||
Designate v1 and v2 APIs.
|
||||
python-designateclient provides python bindings and command line tools for Designate v2 APIs.
|
||||
|
||||
The :ref:`Python API bindings <bindings>` are provided by the
|
||||
:program:`designateclient` module.
|
||||
|
||||
There are two separate command line interfaces to work with the two API
|
||||
versions:
|
||||
|
||||
v2: the designate plugin for the :program:`openstack` command line tool. More information can be
|
||||
The designate plugin for the :program:`openstack` command line tool. More information can be
|
||||
found on the :ref:`designate v2 command line tool page <shell-v2>`.
|
||||
|
||||
v1: the :program:`designate` command line tool. More information can be found
|
||||
on the :ref:`designate v1 command line tool page <shell>`.
|
||||
|
||||
.. warning::
|
||||
|
||||
The V1 API was removed in Queens, and cannot be re-enabled.
|
||||
The :program:`designate` command line tool will no longer function on
|
||||
installs newer than Queens.
|
||||
|
||||
|
||||
You'll need credentials for an OpenStack cloud that implements the Designate
|
||||
API in order to use the client.
|
||||
|
||||
|
@ -32,7 +18,6 @@ API in order to use the client.
|
|||
|
||||
install/index
|
||||
user/index
|
||||
cli/index
|
||||
contributor/index
|
||||
reference/index
|
||||
|
||||
|
@ -41,5 +26,3 @@ API in order to use the client.
|
|||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
||||
.. _Cloud DNS: http://www.hpcloud.com/products-services/dns
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
.. _bindings:
|
||||
|
||||
===========================
|
||||
Python Bindings - v1 and v2
|
||||
Python Bindings - v2
|
||||
===========================
|
||||
|
||||
The python-designateclient package comes with python bindings for both versions
|
||||
of the Designate API: v1 and v2. These can be used to interact with the Designate
|
||||
The python-designateclient package comes with python bindings
|
||||
the Designate API: v2. This can be used to interact with the Designate
|
||||
API from any python program.
|
||||
|
||||
Introduction - Bindings v2
|
||||
|
@ -38,502 +38,3 @@ To view examples of usage please checkout the *doc/examples* folder, basic usage
|
|||
zone = client.zones.create('i.io.', email='i@i.io')
|
||||
|
||||
rs = client.recordsets.create(zone['id'], 'www', 'A', ['10.0.0.1'])
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
Below is a simple example of how to instantiate and perform basic tasks using
|
||||
the bindings.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
from __future__ import print_function
|
||||
from designateclient.v1 import Client
|
||||
|
||||
|
||||
# Create an instance of the client, providing the necessary credentials
|
||||
client = Client(
|
||||
auth_url="https://example.com:5000/v3/",
|
||||
username="openstack",
|
||||
password="yadayada",
|
||||
project_name="myproject",
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
# Fetch a list of the domains this user/tenant has access to
|
||||
domains = client.domains.list()
|
||||
|
||||
# Iterate the list, printing some useful information
|
||||
for domain in domains:
|
||||
print("Domain ID: %s, Name: %s" % (domain.id, domain.name))
|
||||
|
||||
And the output this program might produce:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python /tmp/example.py
|
||||
Domain ID: 467f97b4-f074-4839-ae85-1a61fccfb83d, Name: example-one.com.
|
||||
Domain ID: 6d3bf479-8a93-47ae-8c65-3dff8dba1b0d, Name: example-two.com.
|
||||
|
||||
|
||||
Authentication
|
||||
==============
|
||||
|
||||
Designate supports either Keystone authentication, or no authentication at all.
|
||||
|
||||
Keystone Authentication
|
||||
-----------------------
|
||||
|
||||
Below is a sample of standard authentication with keystone using keystoneauth
|
||||
Sessions. For more information on keystoneauth API, see `Using Sessions`_.
|
||||
|
||||
.. _Using Sessions: https://docs.openstack.org/keystoneauth/latest/using-sessions.html
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
||||
|
||||
# Create an authentication plugin providing the necessary credentials
|
||||
auth = generic.Password(
|
||||
auth_url="https://example.com:5000/v3/",
|
||||
username="openstack",
|
||||
password="yadayada",
|
||||
project_name="myproject",
|
||||
project_domain_id='default',
|
||||
user_domain_id='default'
|
||||
)
|
||||
|
||||
session = keystone_session.Session(auth=auth)
|
||||
|
||||
# Create an instance of the client, providing a keystoneauth Session
|
||||
client = Client(session=session)
|
||||
|
||||
Below is a sample of standard authentication with keystone, but also explicitly
|
||||
providing the endpoint to use:
|
||||
|
||||
.. note:: This is useful when a development Designate instances authenticates
|
||||
against a production Keystone.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
from keystoneauth1.identity import generic
|
||||
from keystoneauth1 import session as keystone_session
|
||||
|
||||
|
||||
# Create an authentication plugin providing the necessary credentials
|
||||
auth = generic.Password(
|
||||
auth_url="https://example.com:5000/v3/",
|
||||
username="openstack",
|
||||
password="yadayada",
|
||||
project_name="myproject",
|
||||
project_domain_id='default',
|
||||
user_domain_id='default')
|
||||
|
||||
session = keystone_session.Session(auth=auth)
|
||||
|
||||
# Create an instance of the client, providing a keystoneauth Session
|
||||
client = Client(
|
||||
session=session,
|
||||
endpoint="https://127.0.0.1:9001/v1/")
|
||||
|
||||
|
||||
No Authentication
|
||||
-----------------
|
||||
|
||||
Below is a sample of interaction with a non authenticated designate:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client, providing the endpoint directly
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
Working with Domains
|
||||
====================
|
||||
|
||||
The Domain Object
|
||||
-----------------
|
||||
|
||||
Object Properties:
|
||||
|
||||
======================= =======================================================
|
||||
Property Description
|
||||
======================= =======================================================
|
||||
id Domain ID
|
||||
name Domain Name (e.g. example.com.)
|
||||
email Domain Responsible Person Email (e.g. fred@example.com)
|
||||
ttl Default TTL for records
|
||||
serial Domain Server Number
|
||||
created_at Date and time this domain was created at
|
||||
updated_at Date and time this domain was last updated
|
||||
description Domain Description
|
||||
======================= =======================================================
|
||||
|
||||
Listing Domains
|
||||
---------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
# List All Domains
|
||||
domains = client.domains.list()
|
||||
|
||||
Fetching a Domain by ID
|
||||
-----------------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the domain
|
||||
domain = client.domains.get(domain_id)
|
||||
|
||||
|
||||
Creating a Domain
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
from designateclient.v1.domains import Domain
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
# Create a new Domain object
|
||||
domain = Domain(name="example.com.", email="fred@example.com")
|
||||
|
||||
# Send the Create Domain API call
|
||||
domain = client.domains.create(domain)
|
||||
|
||||
Updating a Domain
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the domain
|
||||
domain = client.domains.get(domain_id)
|
||||
|
||||
# Update a value on the Domain
|
||||
domain.ttl = 300
|
||||
|
||||
# Send the Update Domain API call
|
||||
domain = client.domains.update(domain)
|
||||
|
||||
Deleting a Domain
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the domain
|
||||
domains = client.domains.delete(domain_id)
|
||||
|
||||
Working with Records
|
||||
====================
|
||||
|
||||
The Record Object
|
||||
-----------------
|
||||
|
||||
Object Properties:
|
||||
|
||||
======================= =======================================================
|
||||
Property Description
|
||||
======================= =======================================================
|
||||
id Record ID
|
||||
domain_id Domain ID
|
||||
name Record Name (e.g. example.com.)
|
||||
type Record Type (e.g. A, AAAA, CNAME, MX, SRV etc)
|
||||
data Record Data (e.g. 127.0.0.1)
|
||||
priority Rercord Priority (Valid only for MX and SRV records)
|
||||
ttl Record TTL
|
||||
created_at Date and time this record was created at
|
||||
updated_at Date and time this record was last updated
|
||||
description Record Description
|
||||
======================= =======================================================
|
||||
|
||||
Listing Records
|
||||
---------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# List All Records
|
||||
records = client.records.list(domain_id)
|
||||
|
||||
Fetching a Record by ID
|
||||
-----------------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
record_id = 'bd3e8520-25e0-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the record
|
||||
records = client.records.get(domain_id, record_id)
|
||||
|
||||
|
||||
Creating a Record
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
from designateclient.v1.records import Record
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Create a new Record object
|
||||
record = Record(name="www.example.com.", type="A", data="127.0.0.1")
|
||||
|
||||
# Send the Create Record API call
|
||||
record = client.records.create(domain_id, record)
|
||||
|
||||
Updating a Record
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
record_id = 'bd3e8520-25e0-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the record
|
||||
record = client.records.get(record_id)
|
||||
|
||||
# Update a value on the Record
|
||||
record.ttl = 300
|
||||
|
||||
# Send the Update Record API call
|
||||
record = client.records.update(domain_id, record)
|
||||
|
||||
Deleting a Record
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
domain_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
record_id = 'bd3e8520-25e0-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the record
|
||||
records = client.records.delete(domain_id, record_id)
|
||||
|
||||
Working with Servers
|
||||
====================
|
||||
|
||||
The Server Object
|
||||
-----------------
|
||||
|
||||
Object Properties:
|
||||
|
||||
======================= =======================================================
|
||||
Property Description
|
||||
======================= =======================================================
|
||||
id Server ID
|
||||
name Server Name (e.g. example.com.)
|
||||
created_at Date and time this server was created at
|
||||
updated_at Date and time this server was last updated
|
||||
======================= =======================================================
|
||||
|
||||
Listing Servers
|
||||
---------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
# List All Servers
|
||||
servers = client.servers.list()
|
||||
|
||||
Fetching a Server by ID
|
||||
-----------------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
server_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the server
|
||||
server = client.servers.get(server_id)
|
||||
|
||||
|
||||
Creating a Server
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
from designateclient.v1.servers import Server
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
# Create a new Server object
|
||||
server = Server(name="ns1.example.com.")
|
||||
|
||||
# Send the Create Server API call
|
||||
server = client.servers.create(server)
|
||||
|
||||
Updating a Server
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
server_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the server
|
||||
server = client.servers.get(server_id)
|
||||
|
||||
# Update a value on the Server
|
||||
server.name = "ns2.example.com"
|
||||
|
||||
# Send the Update Server API call
|
||||
server = client.servers.update(server)
|
||||
|
||||
Deleting a Server
|
||||
-----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from designateclient.v1 import Client
|
||||
|
||||
# Create an instance of the client
|
||||
client = Client(
|
||||
endpoint="https://127.0.0.1:9001/v1/"
|
||||
)
|
||||
|
||||
server_id = 'fb505f10-25df-11e3-8224-0800200c9a66'
|
||||
|
||||
# Fetch the server
|
||||
servers = client.servers.delete(server_id)
|
||||
|
|
|
@ -6,5 +6,3 @@
|
|||
|
||||
bindings
|
||||
shell-v2
|
||||
shell
|
||||
shell-examples
|
||||
|
|
|
@ -1,132 +0,0 @@
|
|||
====================================
|
||||
Designate Command Line Tool Examples
|
||||
====================================
|
||||
|
||||
.. warning:: This page refers to command that use the V1 API, which is currently disabled, and will be removed in a future release
|
||||
|
||||
Using the client against your dev environment
|
||||
---------------------------------------------
|
||||
Typically the designate client talks to Keystone (or a Keystone like service) via the OS_AUTH_URL setting & retrives the designate endpoint from the returned service catalog. Using ``--os-endpoint`` or ``OS_ENDPOINT`` you can specify the end point directly, this is useful if you want to point the client at a test environment that's running without a full Keystone service.
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ designate --os-endpoint http://127.0.0.1:9001/v1 server-create --name ns.example.com.
|
||||
+------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+------------+--------------------------------------+
|
||||
| id | 3dee78df-c6b8-4fbd-8e89-3186c1a4734f |
|
||||
| created_at | 2015-11-04T08:47:12.000000 |
|
||||
| updated_at | None |
|
||||
| name | ns.example.com. |
|
||||
+------------+--------------------------------------+
|
||||
|
||||
$ designate --os-endpoint http://127.0.0.1:9001/v1 domain-create --name example.net. --email me@example.org
|
||||
+-------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| description | None |
|
||||
| created_at | 2015-11-04T08:49:53.000000 |
|
||||
| updated_at | None |
|
||||
| email | me@example.org |
|
||||
| ttl | 3600 |
|
||||
| serial | 1446626993 |
|
||||
| id | f98c3d91-f514-4956-a955-20eefb413a64 |
|
||||
| name | example.net. |
|
||||
+-------------+--------------------------------------+
|
||||
|
||||
$ designate --os-endpoint http://127.0.0.1:9001/v1 record-create --name myhost.example.net. --type A --data 1.2.3.4 f98c3d91-f514-4956-a955-20eefb413a64 (domain_id)
|
||||
+-------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| description | None |
|
||||
| type | A |
|
||||
| created_at | 2015-11-04T08:52:41.000000 |
|
||||
| updated_at | None |
|
||||
| domain_id | f98c3d91-f514-4956-a955-20eefb413a64 |
|
||||
| priority | None |
|
||||
| ttl | None |
|
||||
| data | 1.2.3.4 |
|
||||
| id | b5a74471-8062-4395-be70-968805a0d832 |
|
||||
| name | myhost.example.net. |
|
||||
+-------------+--------------------------------------+
|
||||
|
||||
$ designate domain-list
|
||||
+--------------------------------------+--------------+------------+
|
||||
| id | name | serial |
|
||||
+--------------------------------------+--------------+------------+
|
||||
| 88c14ecf-b034-424c-b081-ca42494dcdf9 | example.com. | 1462372104 |
|
||||
+--------------------------------------+--------------+------------+
|
||||
|
||||
$ designate domain-update --email example@example.com 88c14ecf-b034-424c-b081-ca42494dcdf9 (domain_id)
|
||||
+-------------+---------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+---------------------------------------+
|
||||
| description | None |
|
||||
| created_at | 2016-05-04T14:28:24.000000 |
|
||||
| updated_at | 2016-05-04T14:29:48.000000 |
|
||||
| email | example@example.com |
|
||||
| ttl | 3600 |
|
||||
| serial | 1462372188 |
|
||||
| id | 88c14ecf-b034-424c-b081-ca42494dcdf9 |
|
||||
| name | example.com. |
|
||||
+-------------+---------------------------------------+
|
||||
|
||||
$ designate domain-delete 88c14ecf-b034-424c-b081-ca42494dcdf9 (domain_id)
|
||||
|
||||
$ designate record-list 66584cdd-f7a6-4f0e-acf0-3dd5ad04830d (domain_id)
|
||||
+--------------------------------------+------+-----------------------+-----------------------------------------------------------------+
|
||||
| id | type | name | data |
|
||||
+--------------------------------------+------+-----------------------+-----------------------------------------------------------------+
|
||||
| fdfab9c3-51c0-42b9-b500-7779ef917915 | SOA | example.com. | ns1.example.org. pr8721.att.com. 1462372695 3600 600 86400 3600 |
|
||||
| 242a16e8-8455-4b4d-af7f-45de1074aa04 | NS | example.com. | xyz.com. |
|
||||
| 8dc14df7-3651-49df-8c83-0d71954c6152 | NS | example.com. | ns1.example.org. |
|
||||
| 7e80531d-bd65-49bc-a316-a6a06cd7fe26 | A | example1.example.com. | 198.51.100.1 |
|
||||
+--------------------------------------+------+-----------------------+-----------------------------------------------------------------+
|
||||
|
||||
$ designate record-update --name example1.example.com. --type A --data 198.5.100.2 --ttl 3600 66584cdd-f7a6-4f0e-acf0-3dd5ad04830d (domain-id) 7e80531d-bd65-49bc-a316-a6a06cd7fe26 (record_id)
|
||||
+-------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| description | None |
|
||||
| type | A |
|
||||
| created_at | 2016-05-04T14:38:15.000000 |
|
||||
| updated_at | 2016-05-04T16:12:05.000000 |
|
||||
| domain_id | 66584cdd-f7a6-4f0e-acf0-3dd5ad04830d |
|
||||
| priority | None |
|
||||
| ttl | 3600 |
|
||||
| data | 198.5.100.2 |
|
||||
| id | 7e80531d-bd65-49bc-a316-a6a06cd7fe26 |
|
||||
| name | example1.example.com. |
|
||||
+-------------+--------------------------------------+
|
||||
|
||||
$ designate record-delete 66584cdd-f7a6-4f0e-acf0-3dd5ad04830d (domain-id) 7e80531d-bd65-49bc-a316-a6a06cd7fe26 (record_id)
|
||||
|
||||
$ designate quota-get 70a4596c9974429db5fb6fe240ab87b9 (tenant_id)
|
||||
+-------------------+-------+
|
||||
| Field | Value |
|
||||
+-------------------+-------+
|
||||
| domains | 10 |
|
||||
| domain_recordsets | 500 |
|
||||
| recordset_records | 20 |
|
||||
| domain_records | 500 |
|
||||
+-------------------+-------+
|
||||
|
||||
$ designate quota-update --domains 50 --domain-recordsets 1000 --recordset-records 40 --domain-records 1000 70a4596c9974429db5fb6fe240ab87b9 (tenant_id)
|
||||
+-------------------+-------+
|
||||
| Field | Value |
|
||||
+-------------------+-------+
|
||||
| domains | 50 |
|
||||
| domain_recordsets | 1000 |
|
||||
| recordset_records | 40 |
|
||||
| domain_records | 1000 |
|
||||
+-------------------+-------+
|
||||
|
||||
$ designate quota-get 70a4596c9974429db5fb6fe240ab87b9 (tenant_id)
|
||||
+-------------------+-------+
|
||||
| Field | Value |
|
||||
+-------------------+-------+
|
||||
| domains | 10 |
|
||||
| domain_recordsets | 500 |
|
||||
| recordset_records | 20 |
|
||||
| domain_records | 500 |
|
||||
+-------------------+-------+
|
|
@ -1,248 +0,0 @@
|
|||
.. _shell:
|
||||
|
||||
=========================================================
|
||||
Designate Command Line Tool (compatible with v1 API only)
|
||||
=========================================================
|
||||
|
||||
.. warning:: This page refers to command that use the V1 API, which is currently disabled, and will be removed in a future release
|
||||
|
||||
The python-designateclient package comes with a command line tool (installed as :program:`designate`), this can be used to access a Designate API
|
||||
without having to manipulate JSON by hand, it can also produce the output in a variety of formats (JSON, CSV) and allow you to select columns to be
|
||||
displayed.
|
||||
|
||||
Credentials
|
||||
-----------
|
||||
|
||||
As with any OpenStack utility, :program:`designate` requires certain information to
|
||||
talk to the REST API, username, password, auth url (from where the other required
|
||||
endpoints are retrieved once you are authenticated).
|
||||
|
||||
To provide your access credentials (username, password, tenant name or tenant id)
|
||||
you can pass them on the command line with the ``--os-username``, ``--os-password``, ``--os-tenant-name`` or ``--os-tenant-id``
|
||||
params, but it's easier to just set them as environment variables::
|
||||
|
||||
export OS_USERNAME=openstack
|
||||
export OS_PASSWORD=yadayada
|
||||
export OS_TENANT_NAME=myproject
|
||||
export OS_TENANT_ID=123456789
|
||||
|
||||
You will also need to define the authentication url with ``--os-auth-url``
|
||||
or set is as an environment variable as well::
|
||||
|
||||
export OS_AUTH_URL=https://example.com:5000/v2.0/
|
||||
|
||||
Since Keystone can return multiple regions in the Service Catalog, you
|
||||
can specify the one you want with ``--os-region-name`` (or
|
||||
``export OS_REGION_NAME``). It defaults to the first in the list returned.
|
||||
|
||||
Using the command line tool
|
||||
---------------------------
|
||||
|
||||
With enough details now in the environment, you can use the designate client to create a domain and populate it with some records:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ designate domain-create --name example.com. --email admin@example.com
|
||||
+-------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| description | None |
|
||||
| created_at | 2013-09-19T11:45:25.295355 |
|
||||
| updated_at | None |
|
||||
| email | admin@example.com |
|
||||
| ttl | 3600 |
|
||||
| serial | 1379591125 |
|
||||
| id | eacbe2a5-95f1-4a9f-89f5-b9c58009b163 |
|
||||
| name | example.com. |
|
||||
+-------------+--------------------------------------+
|
||||
|
||||
Now that the domain has been created, we can start adding records.
|
||||
|
||||
You'll note that the name (www.example.com) has a trailing ``.``, as per the DNS standard, we didn't set a TTL and we had to specify the parent
|
||||
zone/domain by domain_id ``eacbe2a5-95f1-4a9f-89f5-b9c58009b163``.
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ designate record-create eacbe2a5-95f1-4a9f-89f5-b9c58009b163 --name www.example.com. --type A --data 1.2.3.4
|
||||
+-------------+--------------------------------------+
|
||||
| Field | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| name | www.example.com. |
|
||||
| data | 1.2.3.4 |
|
||||
| created_at | 2013-09-19T13:44:42.295428 |
|
||||
| updated_at | None |
|
||||
| id | 147f6082-8466-4951-8d13-37a10e92b11e |
|
||||
| priority | None |
|
||||
| ttl | None |
|
||||
| type | A |
|
||||
| domain_id | eacbe2a5-95f1-4a9f-89f5-b9c58009b163 |
|
||||
| description | None |
|
||||
+-------------+--------------------------------------+
|
||||
|
||||
subcommands
|
||||
-----------
|
||||
|
||||
We've already seen the ``domain-create`` and ``record-create`` subcommands, here the full list of subcommands:
|
||||
|
||||
======================= ====================================================== ===============
|
||||
subcommand Notes Admin Required
|
||||
======================= ====================================================== ===============
|
||||
complete print bash completion command
|
||||
diagnostics-ping Ping a service on a given host
|
||||
domain-create Create Domain
|
||||
domain-delete Delete Domain
|
||||
domain-get Get Domain
|
||||
domain-list List Domains
|
||||
domain-servers-list List Domain Servers
|
||||
domain-update Update Domain
|
||||
help print detailed help for another command
|
||||
quota-get Get Quota
|
||||
quota-reset Reset Quota
|
||||
quota-update Update Quota
|
||||
record-create Create Record
|
||||
record-delete Delete Record
|
||||
record-get Get Record
|
||||
record-list List Records
|
||||
record-update Update Record
|
||||
report-count-all Get count totals for all tenants, domains and records
|
||||
report-count-domains Get counts for total domains
|
||||
report-count-records Get counts for total records
|
||||
report-count-tenants Get counts for total tenants
|
||||
report-tenant-domains Get a list of domains for given tenant
|
||||
report-tenants-all Get list of tenants and domain count for each
|
||||
server-create Create Server
|
||||
server-delete Delete Server
|
||||
server-get Get Server
|
||||
server-list List Servers
|
||||
server-update Update Server
|
||||
sync-all Sync Everything
|
||||
sync-domain Sync a single Domain
|
||||
sync-record Sync a single Record
|
||||
touch-domain Touch a single Domain
|
||||
|
||||
======================= ====================================================== ===============
|
||||
|
||||
Builtin designate documentation
|
||||
-------------------------------
|
||||
|
||||
You'll find complete documentation on the shell by running
|
||||
``designate --help``:
|
||||
|
||||
usage: designate [--version] [-v] [--log-file LOG_FILE] [-q] [-h] [--debug]
|
||||
[--os-username OS_USERNAME] [--os-user-id OS_USER_ID]
|
||||
[--os-user-domain-id OS_USER_DOMAIN_ID]
|
||||
[--os-user-domain-name OS_USER_DOMAIN_NAME]
|
||||
[--os-password OS_PASSWORD] [--os-tenant-name OS_TENANT_NAME]
|
||||
[--os-tenant-id OS_TENANT_ID]
|
||||
[--os-project-name OS_PROJECT_NAME]
|
||||
[--os-domain-name OS_DOMAIN_NAME]
|
||||
[--os-domain-id OS_DOMAIN_ID] [--os-project-id OS_PROJECT_ID]
|
||||
[--os-project-domain-id OS_PROJECT_DOMAIN_ID]
|
||||
[--os-project-domain-name OS_PROJECT_DOMAIN_NAME]
|
||||
[--os-auth-url OS_AUTH_URL] [--os-region-name OS_REGION_NAME]
|
||||
[--os-token OS_TOKEN] [--os-endpoint OS_ENDPOINT]
|
||||
[--os-endpoint-type OS_ENDPOINT_TYPE]
|
||||
[--os-service-type OS_SERVICE_TYPE] [--os-cacert OS_CACERT]
|
||||
[--insecure] [--all-tenants] [--edit-managed]
|
||||
|
||||
Designate Client
|
||||
|
||||
optional arguments:
|
||||
--version show program's version number and exit
|
||||
-v, --verbose Increase verbosity of output. Can be repeated.
|
||||
--log-file LOG_FILE Specify a file to log output. Disabled by default.
|
||||
-q, --quiet Suppress output except warnings and errors.
|
||||
-h, --help Show this help message and exit.
|
||||
--debug Show tracebacks on errors.
|
||||
--os-username OS_USERNAME
|
||||
Name used for authentication with the OpenStack
|
||||
Identity service. Defaults to env[OS_USERNAME].
|
||||
--os-user-id OS_USER_ID
|
||||
User ID used for authentication with the OpenStack
|
||||
Identity service. Defaults to env[OS_USER_ID].
|
||||
--os-user-domain-id OS_USER_DOMAIN_ID
|
||||
Defaults to env[OS_USER_DOMAIN_ID].
|
||||
--os-user-domain-name OS_USER_DOMAIN_NAME
|
||||
Defaults to env[OS_USER_DOMAIN_NAME].
|
||||
--os-password OS_PASSWORD
|
||||
Password used for authentication with the OpenStack
|
||||
Identity service. Defaults to env[OS_PASSWORD].
|
||||
--os-tenant-name OS_TENANT_NAME
|
||||
Tenant to request authorization on. Defaults to
|
||||
env[OS_TENANT_NAME].
|
||||
--os-tenant-id OS_TENANT_ID
|
||||
Tenant to request authorization on. Defaults to
|
||||
env[OS_TENANT_ID].
|
||||
--os-project-name OS_PROJECT_NAME
|
||||
Project to request authorization on. Defaults to
|
||||
env[OS_PROJECT_NAME].
|
||||
--os-domain-name OS_DOMAIN_NAME
|
||||
Project to request authorization on. Defaults to
|
||||
env[OS_DOMAIN_NAME].
|
||||
--os-domain-id OS_DOMAIN_ID
|
||||
Defaults to env[OS_DOMAIN_ID].
|
||||
--os-project-id OS_PROJECT_ID
|
||||
Project to request authorization on. Defaults to
|
||||
env[OS_PROJECT_ID].
|
||||
--os-project-domain-id OS_PROJECT_DOMAIN_ID
|
||||
Defaults to env[OS_PROJECT_DOMAIN_ID].
|
||||
--os-project-domain-name OS_PROJECT_DOMAIN_NAME
|
||||
Defaults to env[OS_PROJECT_DOMAIN_NAME].
|
||||
--os-auth-url OS_AUTH_URL
|
||||
Specify the Identity endpoint to use for
|
||||
authentication. Defaults to env[OS_AUTH_URL].
|
||||
--os-region-name OS_REGION_NAME
|
||||
Specify the region to use. Defaults to
|
||||
env[OS_REGION_NAME].
|
||||
--os-token OS_TOKEN Specify an existing token to use instead of retrieving
|
||||
one via authentication (e.g. with username &
|
||||
password). Defaults to env[OS_SERVICE_TOKEN].
|
||||
--os-endpoint OS_ENDPOINT
|
||||
Specify an endpoint to use instead of retrieving one
|
||||
from the service catalog (via authentication).
|
||||
Defaults to env[OS_DNS_ENDPOINT].
|
||||
--os-endpoint-type OS_ENDPOINT_TYPE
|
||||
Defaults to env[OS_ENDPOINT_TYPE].
|
||||
--os-service-type OS_SERVICE_TYPE
|
||||
Defaults to env[OS_DNS_SERVICE_TYPE], or 'dns'.
|
||||
--os-cacert OS_CACERT
|
||||
CA certificate bundle file. Defaults to
|
||||
env[OS_CACERT].
|
||||
--insecure Explicitly allow 'insecure' SSL requests.
|
||||
--all-tenants Allows to list all domains from all tenants.
|
||||
--edit-managed Allows to edit records that are marked as managed.
|
||||
|
||||
|
||||
Commands:
|
||||
complete print bash completion command
|
||||
diagnostics-ping Ping a service on a given host
|
||||
domain-create Create Domain
|
||||
domain-delete Delete Domain
|
||||
domain-get Get Domain
|
||||
domain-list List Domains
|
||||
domain-servers-list List Domain Servers
|
||||
domain-update Update Domain
|
||||
help print detailed help for another command
|
||||
quota-get Get Quota
|
||||
quota-reset Reset Quota
|
||||
quota-update Update Quota
|
||||
record-create Create Record
|
||||
record-delete Delete Record
|
||||
record-get Get Record
|
||||
record-list List Records
|
||||
record-update Update Record
|
||||
report-count-all Get count totals for all tenants, domains and records
|
||||
report-count-domains Get counts for total domains
|
||||
report-count-records Get counts for total records
|
||||
report-count-tenants Get counts for total tenants
|
||||
report-tenant-domains Get a list of domains for given tenant
|
||||
report-tenants-all Get list of tenants and domain count for each
|
||||
server-create Create Server
|
||||
server-delete Delete Server
|
||||
server-get Get Server
|
||||
server-list List Servers
|
||||
server-update Update Server
|
||||
sync-all Sync Everything
|
||||
sync-domain Sync a single Domain
|
||||
sync-record Sync a single Record
|
||||
touch-domain Touch a single Domain
|
|
@ -61,7 +61,7 @@ python-mimeparse==1.6.0
|
|||
python-subunit==1.0.0
|
||||
pytz==2013.6
|
||||
PyYAML==3.12
|
||||
reno==2.5.0
|
||||
reno==2.7.0
|
||||
requests==2.14.2
|
||||
requests-mock==1.2.0
|
||||
requestsexceptions==1.2.0
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
upgrade:
|
||||
- |
|
||||
Removed V1 API support from the client, as it was permanently
|
||||
removed in the Queens release of Designate.
|
52
setup.cfg
52
setup.cfg
|
@ -28,61 +28,9 @@ setup-hooks =
|
|||
[files]
|
||||
packages =
|
||||
designateclient
|
||||
scripts =
|
||||
bin/designate
|
||||
|
||||
[entry_points]
|
||||
designateclient.v1.controllers =
|
||||
reports = designateclient.v1.reports:ReportsController
|
||||
diagnostics = designateclient.v1.diagnostics:DiagnosticsController
|
||||
domains = designateclient.v1.domains:DomainsController
|
||||
records = designateclient.v1.records:RecordsController
|
||||
servers = designateclient.v1.servers:ServersController
|
||||
quotas = designateclient.v1.quotas:QuotasController
|
||||
sync = designateclient.v1.sync:SyncController
|
||||
touch = designateclient.v1.touch:TouchController
|
||||
|
||||
designateclient.cli =
|
||||
domain-list = designateclient.cli.domains:ListDomainsCommand
|
||||
domain-get = designateclient.cli.domains:GetDomainCommand
|
||||
domain-create = designateclient.cli.domains:CreateDomainCommand
|
||||
domain-update = designateclient.cli.domains:UpdateDomainCommand
|
||||
domain-delete = designateclient.cli.domains:DeleteDomainCommand
|
||||
domain-servers-list = designateclient.cli.domains:ListDomainServersCommand
|
||||
|
||||
record-list = designateclient.cli.records:ListRecordsCommand
|
||||
record-get = designateclient.cli.records:GetRecordCommand
|
||||
record-create = designateclient.cli.records:CreateRecordCommand
|
||||
record-update = designateclient.cli.records:UpdateRecordCommand
|
||||
record-delete = designateclient.cli.records:DeleteRecordCommand
|
||||
|
||||
server-list = designateclient.cli.servers:ListServersCommand
|
||||
server-get = designateclient.cli.servers:GetServerCommand
|
||||
server-create = designateclient.cli.servers:CreateServerCommand
|
||||
server-update = designateclient.cli.servers:UpdateServerCommand
|
||||
server-delete = designateclient.cli.servers:DeleteServerCommand
|
||||
|
||||
diagnostics-ping = designateclient.cli.diagnostics:PingCommand
|
||||
|
||||
sync-all = designateclient.cli.sync:SyncAllCommand
|
||||
sync-domain = designateclient.cli.sync:SyncDomainCommand
|
||||
sync-record = designateclient.cli.sync:SyncRecordCommand
|
||||
|
||||
touch-domain = designateclient.cli.touch:TouchDomainCommand
|
||||
|
||||
report-count-all = designateclient.cli.reports:CountsCommand
|
||||
report-count-domains = designateclient.cli.reports:DomainCountCommand
|
||||
report-count-records = designateclient.cli.reports:RecordCountCommand
|
||||
report-count-tenants = designateclient.cli.reports:TenantCountCommand
|
||||
report-tenants-all = designateclient.cli.reports:TenantsCommand
|
||||
report-tenant-domains = designateclient.cli.reports:TenantCommand
|
||||
|
||||
quota-get = designateclient.cli.quotas:GetQuotaCommand
|
||||
quota-update = designateclient.cli.quotas:UpdateQuotaCommand
|
||||
quota-reset = designateclient.cli.quotas:ResetQuotaCommand
|
||||
|
||||
designateclient.versions =
|
||||
1 = designateclient.v1:Client
|
||||
2 = designateclient.v2.client:Client
|
||||
|
||||
openstack.cli.extension =
|
||||
|
|
|
@ -11,5 +11,5 @@ os-testr>=1.0.0 # Apache-2.0
|
|||
python-subunit>=1.0.0 # Apache-2.0/BSD
|
||||
requests-mock>=1.2.0 # Apache-2.0
|
||||
stestr>=2.0.0 # Apache-2.0
|
||||
reno>=2.5.0 # Apache-2.0
|
||||
reno>=2.7.0 # Apache-2.0
|
||||
tempest>=17.1.0 # Apache-2.0
|
||||
|
|
Loading…
Reference in New Issue