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."""
|
"""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'
|
DEFAULT_API_VERSION = '2'
|
||||||
|
@ -45,7 +45,7 @@ def build_option_parser(parser):
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--os-dns-api-version',
|
'--os-dns-api-version',
|
||||||
metavar='<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=' +
|
help='DNS API version, default=' +
|
||||||
DEFAULT_API_VERSION +
|
DEFAULT_API_VERSION +
|
||||||
' (Env: OS_DNS_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.assertRaises(exceptions.NoUniqueMatch,
|
||||||
self._find_resourceid_by_name_or_id,
|
self._find_resourceid_by_name_or_id,
|
||||||
'baba', by_name=True)
|
'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
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import os
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
|
||||||
|
|
||||||
from debtcollector import removals
|
from debtcollector import removals
|
||||||
from keystoneauth1 import adapter
|
from keystoneauth1 import adapter
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as ks_session
|
from keystoneauth1 import session as ks_session
|
||||||
from keystoneauth1 import token_endpoint
|
from keystoneauth1 import token_endpoint
|
||||||
import pkg_resources
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from designateclient import exceptions
|
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={}):
|
def get_item_properties(item, fields, mixed_case_fields=[], formatters={}):
|
||||||
"""Return a tuple containing the item properties.
|
"""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
|
from __future__ import print_function
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
from designateclient import exceptions
|
from designateclient import exceptions
|
||||||
from designateclient import shell
|
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as keystone_session
|
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 = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
from designateclient import exceptions
|
from designateclient import exceptions
|
||||||
from designateclient import shell
|
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as keystone_session
|
from keystoneauth1 import session as keystone_session
|
||||||
|
@ -11,10 +11,10 @@ from keystoneauth1 import session as keystone_session
|
||||||
logging.basicConfig(level='DEBUG')
|
logging.basicConfig(level='DEBUG')
|
||||||
|
|
||||||
auth = generic.Password(
|
auth = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
from designateclient import exceptions
|
from designateclient import exceptions
|
||||||
from designateclient import shell
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
|
@ -13,10 +13,10 @@ from keystoneauth1 import session as keystone_session
|
||||||
logging.basicConfig(level='DEBUG')
|
logging.basicConfig(level='DEBUG')
|
||||||
|
|
||||||
auth = generic.Password(
|
auth = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,20 @@
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as keystone_session
|
from keystoneauth1 import session as keystone_session
|
||||||
|
|
||||||
from designateclient import exceptions
|
|
||||||
from designateclient import shell
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(level='DEBUG')
|
logging.basicConfig(level='DEBUG')
|
||||||
|
|
||||||
auth = generic.Password(
|
auth = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
from designateclient import shell
|
|
||||||
from designateclient import utils
|
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as keystone_session
|
from keystoneauth1 import session as keystone_session
|
||||||
|
@ -12,10 +11,10 @@ from keystoneauth1 import session as keystone_session
|
||||||
logging.basicConfig(level='DEBUG')
|
logging.basicConfig(level='DEBUG')
|
||||||
|
|
||||||
auth = generic.Password(
|
auth = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
from keystoneauth1.identity import generic
|
from keystoneauth1.identity import generic
|
||||||
from keystoneauth1 import session as keystone_session
|
from keystoneauth1 import session as keystone_session
|
||||||
|
|
||||||
from designateclient import shell
|
|
||||||
from designateclient.v2 import client
|
from designateclient.v2 import client
|
||||||
|
|
||||||
logging.basicConfig(level='DEBUG')
|
logging.basicConfig(level='DEBUG')
|
||||||
|
|
||||||
auth = generic.Password(
|
auth = generic.Password(
|
||||||
auth_url=shell.env('OS_AUTH_URL'),
|
auth_url=os.environ.get('OS_AUTH_URL'),
|
||||||
username=shell.env('OS_USERNAME'),
|
username=os.environ.get('OS_USERNAME'),
|
||||||
password=shell.env('OS_PASSWORD'),
|
password=os.environ.get('OS_PASSWORD'),
|
||||||
project_name=shell.env('OS_PROJECT_NAME'),
|
project_name=os.environ.get('OS_PROJECT_NAME'),
|
||||||
project_domain_id='default',
|
project_domain_id='default',
|
||||||
user_domain_id='default')
|
user_domain_id='default')
|
||||||
|
|
||||||
|
|
|
@ -3,4 +3,5 @@
|
||||||
# process, which may cause wedges in the gate later.
|
# 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,<2.0.0;python_version=='2.7' # BSD
|
||||||
sphinx!=1.6.6,!=1.6.7,>=1.6.2;python_version>='3.4' # 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
|
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
|
git rebase -i
|
||||||
# submit
|
# submit
|
||||||
git-review
|
git-review
|
||||||
|
|
||||||
|
|
|
@ -2,28 +2,14 @@
|
||||||
python-designateclient
|
python-designateclient
|
||||||
======================
|
======================
|
||||||
|
|
||||||
python-designateclient provides python bindings and command line tools for both
|
python-designateclient provides python bindings and command line tools for Designate v2 APIs.
|
||||||
Designate v1 and v2 APIs.
|
|
||||||
|
|
||||||
The :ref:`Python API bindings <bindings>` are provided by the
|
The :ref:`Python API bindings <bindings>` are provided by the
|
||||||
:program:`designateclient` module.
|
:program:`designateclient` module.
|
||||||
|
|
||||||
There are two separate command line interfaces to work with the two API
|
The designate plugin for the :program:`openstack` command line tool. More information can be
|
||||||
versions:
|
|
||||||
|
|
||||||
v2: 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>`.
|
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
|
You'll need credentials for an OpenStack cloud that implements the Designate
|
||||||
API in order to use the client.
|
API in order to use the client.
|
||||||
|
|
||||||
|
@ -32,7 +18,6 @@ API in order to use the client.
|
||||||
|
|
||||||
install/index
|
install/index
|
||||||
user/index
|
user/index
|
||||||
cli/index
|
|
||||||
contributor/index
|
contributor/index
|
||||||
reference/index
|
reference/index
|
||||||
|
|
||||||
|
@ -41,5 +26,3 @@ API in order to use the client.
|
||||||
* :ref:`genindex`
|
* :ref:`genindex`
|
||||||
* :ref:`modindex`
|
* :ref:`modindex`
|
||||||
* :ref:`search`
|
* :ref:`search`
|
||||||
|
|
||||||
.. _Cloud DNS: http://www.hpcloud.com/products-services/dns
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
.. _bindings:
|
.. _bindings:
|
||||||
|
|
||||||
===========================
|
===========================
|
||||||
Python Bindings - v1 and v2
|
Python Bindings - v2
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
The python-designateclient package comes with python bindings for both versions
|
The python-designateclient package comes with python bindings
|
||||||
of the Designate API: v1 and v2. These can be used to interact with the Designate
|
the Designate API: v2. This can be used to interact with the Designate
|
||||||
API from any python program.
|
API from any python program.
|
||||||
|
|
||||||
Introduction - Bindings v2
|
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')
|
zone = client.zones.create('i.io.', email='i@i.io')
|
||||||
|
|
||||||
rs = client.recordsets.create(zone['id'], 'www', 'A', ['10.0.0.1'])
|
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
|
bindings
|
||||||
shell-v2
|
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
|
python-subunit==1.0.0
|
||||||
pytz==2013.6
|
pytz==2013.6
|
||||||
PyYAML==3.12
|
PyYAML==3.12
|
||||||
reno==2.5.0
|
reno==2.7.0
|
||||||
requests==2.14.2
|
requests==2.14.2
|
||||||
requests-mock==1.2.0
|
requests-mock==1.2.0
|
||||||
requestsexceptions==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]
|
[files]
|
||||||
packages =
|
packages =
|
||||||
designateclient
|
designateclient
|
||||||
scripts =
|
|
||||||
bin/designate
|
|
||||||
|
|
||||||
[entry_points]
|
[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 =
|
designateclient.versions =
|
||||||
1 = designateclient.v1:Client
|
|
||||||
2 = designateclient.v2.client:Client
|
2 = designateclient.v2.client:Client
|
||||||
|
|
||||||
openstack.cli.extension =
|
openstack.cli.extension =
|
||||||
|
|
|
@ -11,5 +11,5 @@ os-testr>=1.0.0 # Apache-2.0
|
||||||
python-subunit>=1.0.0 # Apache-2.0/BSD
|
python-subunit>=1.0.0 # Apache-2.0/BSD
|
||||||
requests-mock>=1.2.0 # Apache-2.0
|
requests-mock>=1.2.0 # Apache-2.0
|
||||||
stestr>=2.0.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
|
tempest>=17.1.0 # Apache-2.0
|
||||||
|
|
Loading…
Reference in New Issue