Merge "Add TSIG key support for DNS zones in SDK"

This commit is contained in:
Zuul 2024-12-17 19:50:43 +00:00 committed by Gerrit Code Review
commit 109e674c15
4 changed files with 223 additions and 0 deletions

View File

@ -14,6 +14,7 @@ from openstack.dns.v2 import floating_ip as _fip
from openstack.dns.v2 import limit as _limit
from openstack.dns.v2 import recordset as _rs
from openstack.dns.v2 import service_status as _svc_status
from openstack.dns.v2 import tsigkey as _tsigkey
from openstack.dns.v2 import zone as _zone
from openstack.dns.v2 import zone_export as _zone_export
from openstack.dns.v2 import zone_import as _zone_import
@ -29,6 +30,7 @@ class Proxy(proxy.Proxy):
"recordset": _rs.Recordset,
"service_status": _svc_status.ServiceStatus,
"zone": _zone.Zone,
"tsigkey": _tsigkey.TSIGKey,
"zone_export": _zone_export.ZoneExport,
"zone_import": _zone_import.ZoneImport,
"zone_share": _zone_share.ZoneShare,
@ -730,3 +732,76 @@ class Proxy(proxy.Proxy):
filters=filters,
resource_evaluation_fn=resource_evaluation_fn,
)
# ====== TSIG keys ======
def tsigkeys(self, **query):
"""Retrieve a generator of zones
:param dict query: Optional query parameters to be sent to limit the
resources being returned.
:returns: A generator of zone
:class: `~openstack.dns.v2.tsigkey.TSIGKey` instances.
"""
return self._list(_tsigkey.TSIGKey, **query)
def create_tsigkey(self, **attrs):
"""Create a new tsigkey from attributes
:param dict attrs: Keyword arguments which will be used to create
a :class:`~openstack.dns.v2.tsigkey.Tsigkey`,
comprised of the properties on the Tsigkey class.
:returns: The results of zone creation.
:rtype: :class:`~openstack.dns.v2.tsigkey.Tsigkey`
"""
return self._create(_tsigkey.TSIGKey, prepend_key=False, **attrs)
def get_tsigkey(self, tsigkey):
"""Get a zone
:param tsigkey: The value can be the ID of a tsigkey
or a :class:'~openstack.dns.v2.tsigkey.TSIGKey' instance.
:returns: A generator of tsigkey
:class:'~openstack.dns.v2.tsigkey.TSIGKey' instances.
"""
return self._get(_tsigkey.TSIGKey, tsigkey)
def delete_tsigkey(
self, tsigkey, ignore_missing=True, delete_shares=False
):
"""Delete a TSIG key
:param tsigkey: The value can be the ID of a TSIG key
or a :class:`~openstack.dns.v2.tsigkey.TSIGKey` instance.
:param bool ignore_missing: When set to ``False``
:class:`~openstack.exceptions.ResourceNotFound` will be raised when
the TSIG key does not exist.
When set to ``True``, no exception will be set when attempting to
delete a nonexistent TSIG key.
:returns: TSIG Key that has been deleted
:rtype: :class:`~openstack.dns.v2.tsigkey.TSIGKey`
"""
return self._delete(
_tsigkey.TSIGKey,
tsigkey,
ignore_missing=ignore_missing,
delete_shares=delete_shares,
)
def find_tsigkey(self, name_or_id, ignore_missing=True):
"""Find a single tsigkey
:param name_or_id: The name or ID of a tsigkey
:param bool ignore_missing: When set to ``False``
:class: `!openstack.exceptions.ResourceNotFound` will be raised
when the tsigkey does not exit.
Wehn set to ``True``, no exception will be set when attempting
to delete a nonexitstent zone.
:returns::class:`~openstack.dns.v2.tsigkey.TSIGKey`
"""
return self._find(
_tsigkey.TSIGKey, name_or_id, ignore_missing=ignore_missing
)

View File

@ -0,0 +1,62 @@
# 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 openstack.dns.v2 import _base
from openstack import resource
# from openstack import exceptions
# from openstack import utils
class TSIGKey(_base.Resource):
"""DNS TSIGKEY Resource"""
resources_key = 'tsigkeys'
base_path = '/tsigkeys'
# capabilities
allow_create = True
allow_fetch = True
allow_commit = True
allow_delete = True
allow_list = True
commit_method = "PATCH"
_query_mapping = resource.QueryParameters(
'name',
'algorithm',
'scope',
'limit',
'marker',
)
#: Properties
#: ID for the resource
id = resource.Body('id')
#: resource id for this tsigkey which can be either zone or pool id
resource_id = resource.Body('resource_id')
#: TSIGKey name
name = resource.Body('name')
#: scope for this tsigkey which can be either ZONE or POOL scope
scope = resource.Body('scope')
#: The actual key to be used
secret = resource.Body('secret')
#: The encryption algorithm for this tsigkey
algorithm = resource.Body('algorithm')
#: Timestamp when the tsigkey was created
created_at = resource.Body('created_at')
#: Timestamp when the tsigkey was last updated
updated_at = resource.Body('updated_at')
#: Links contains a 'self' pertaining to this tsigkey or a 'next' pertaining
#: to next page
links = resource.Body('links', type=dict)

View File

@ -14,6 +14,7 @@ from openstack.dns.v2 import _proxy
from openstack.dns.v2 import floating_ip
from openstack.dns.v2 import recordset
from openstack.dns.v2 import service_status
from openstack.dns.v2 import tsigkey
from openstack.dns.v2 import zone
from openstack.dns.v2 import zone_export
from openstack.dns.v2 import zone_import
@ -324,3 +325,30 @@ class TestDnsServiceStatus(TestDnsProxy):
self.verify_get(
self.proxy.get_service_status, service_status.ServiceStatus
)
class TestDnsTsigKey(TestDnsProxy):
def test_tsigkey_create(self):
self.verify_create(
self.proxy.create_tsigkey,
tsigkey.TSIGKey,
method_kwargs={'name': 'id'},
expected_kwargs={'name': 'id', 'prepend_key': False},
)
def test_tsigkey_delete(self):
self.verify_delete(
self.proxy.delete_tsigkey,
tsigkey.TSIGKey,
True,
expected_kwargs={'ignore_missing': True, 'delete_shares': False},
)
def test_tsigkey_find(self):
self.verify_find(self.proxy.find_tsigkey, tsigkey.TSIGKey)
def test_tsigkey_get(self):
self.verify_get(self.proxy.get_tsigkey, tsigkey.TSIGKey)
def test_tesigkeys(self):
self.verify_list(self.proxy.tsigkeys, tsigkey.TSIGKey)

View File

@ -0,0 +1,58 @@
# 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 openstack.dns.v2 import tsigkey
from openstack.tests.unit import base
IDENTIFIER = '4c72c7d3-6cfa-4fe1-9984-7705119f0228'
EXAMPLE = {
"id": IDENTIFIER,
"name": 'test-key',
"algorithm": 'hmac-sha512',
"secret": 'test-secret',
"scope": 'POOL',
"resource_id": IDENTIFIER,
}
class TestTsigKey(base.TestCase):
def test_basic(self):
sot = tsigkey.TSIGKey()
self.assertEqual(None, sot.resource_key)
self.assertEqual('tsigkeys', sot.resources_key)
self.assertEqual('/tsigkeys', sot.base_path)
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_fetch)
self.assertTrue(sot.allow_commit)
self.assertTrue(sot.allow_delete)
self.assertTrue(sot.allow_list)
self.assertEqual('PATCH', sot.commit_method)
self.assertDictEqual(
{
'name': 'name',
'algorithm': 'algorithm',
'scope': 'scope',
'limit': 'limit',
'marker': 'marker',
},
sot._query_mapping._mapping,
)
def test_make_it(self):
sot = tsigkey.TSIGKey(**EXAMPLE)
self.assertEqual(IDENTIFIER, sot.id)
self.assertEqual(EXAMPLE['name'], sot.name)
self.assertEqual(EXAMPLE['algorithm'], sot.algorithm)
self.assertEqual(EXAMPLE['scope'], sot.scope)
self.assertEqual(EXAMPLE['resource_id'], sot.resource_id)
self.assertEqual(EXAMPLE['secret'], sot.secret)