Merge "Add support for dns blacklist CRUD"
This commit is contained in:
@@ -82,3 +82,12 @@ Service Status Operations
|
|||||||
.. autoclass:: openstack.dns.v2._proxy.Proxy
|
.. autoclass:: openstack.dns.v2._proxy.Proxy
|
||||||
:noindex:
|
:noindex:
|
||||||
:members: service_statuses, get_service_status
|
:members: service_statuses, get_service_status
|
||||||
|
|
||||||
|
|
||||||
|
Blacklist Operations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. autoclass:: openstack.dns.v2._proxy.Proxy
|
||||||
|
:noindex:
|
||||||
|
:members: blacklists, get_blacklist, create_blacklist,
|
||||||
|
update_blacklist, delete_blacklist
|
||||||
|
@@ -13,3 +13,4 @@ DNS Resources
|
|||||||
v2/recordset
|
v2/recordset
|
||||||
v2/limit
|
v2/limit
|
||||||
v2/service_status
|
v2/service_status
|
||||||
|
v2/blacklist
|
||||||
|
12
doc/source/user/resources/dns/v2/blacklist.rst
Normal file
12
doc/source/user/resources/dns/v2/blacklist.rst
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
openstack.dns.v2.blacklist
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. automodule:: openstack.dns.v2.blacklist
|
||||||
|
|
||||||
|
The Blacklist Class
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The ``Blacklist`` class inherits from :class:`~openstack.resource.Resource`.
|
||||||
|
|
||||||
|
.. autoclass:: openstack.dns.v2.blacklist.Blacklist
|
||||||
|
:members:
|
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
import typing as ty
|
import typing as ty
|
||||||
|
|
||||||
|
from openstack.dns.v2 import blacklist as _blacklist
|
||||||
from openstack.dns.v2 import floating_ip as _fip
|
from openstack.dns.v2 import floating_ip as _fip
|
||||||
from openstack.dns.v2 import limit as _limit
|
from openstack.dns.v2 import limit as _limit
|
||||||
from openstack.dns.v2 import recordset as _rs
|
from openstack.dns.v2 import recordset as _rs
|
||||||
@@ -29,6 +30,7 @@ from openstack import resource
|
|||||||
|
|
||||||
class Proxy(proxy.Proxy):
|
class Proxy(proxy.Proxy):
|
||||||
_resource_registry = {
|
_resource_registry = {
|
||||||
|
"blacklist": _blacklist.Blacklist,
|
||||||
"floating_ip": _fip.FloatingIP,
|
"floating_ip": _fip.FloatingIP,
|
||||||
"limits": _limit.Limit,
|
"limits": _limit.Limit,
|
||||||
"recordset": _rs.Recordset,
|
"recordset": _rs.Recordset,
|
||||||
@@ -891,3 +893,60 @@ class Proxy(proxy.Proxy):
|
|||||||
return self._find(
|
return self._find(
|
||||||
_tsigkey.TSIGKey, name_or_id, ignore_missing=ignore_missing
|
_tsigkey.TSIGKey, name_or_id, ignore_missing=ignore_missing
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ======== Blacklists ========
|
||||||
|
def blacklists(self, **query):
|
||||||
|
"""Retrieve a generator of blacklists
|
||||||
|
|
||||||
|
:returns: A generator of blacklist
|
||||||
|
(:class:`~openstack.dns.v2.blacklist.Blacklist`) instances
|
||||||
|
"""
|
||||||
|
return self._list(_blacklist.Blacklist, **query)
|
||||||
|
|
||||||
|
def get_blacklist(self, blacklist):
|
||||||
|
"""Get a blacklist
|
||||||
|
|
||||||
|
:param blacklist: The value can be the ID of a blacklist
|
||||||
|
or a :class:`~openstack.dns.v2.blacklist.Blacklist` instance.
|
||||||
|
|
||||||
|
:returns: Blacklist instance.
|
||||||
|
:rtype: :class:`~openstack.dns.v2.blacklist.Blacklist`
|
||||||
|
"""
|
||||||
|
return self._get(_blacklist.Blacklist, blacklist)
|
||||||
|
|
||||||
|
def create_blacklist(self, **attrs):
|
||||||
|
"""Create a new blacklist
|
||||||
|
|
||||||
|
:param attrs: Keyword arguments which will be used to create
|
||||||
|
a :class:`~openstack.dns.v2.blacklist.Blacklist`,
|
||||||
|
comprised of the properties on the Blacklist class.
|
||||||
|
|
||||||
|
:returns: The results of blacklist creation.
|
||||||
|
:rtype: :class:`~openstack.dns.v2.blacklist.Blacklist`
|
||||||
|
"""
|
||||||
|
return self._create(_blacklist.Blacklist, prepend_key=False, **attrs)
|
||||||
|
|
||||||
|
def update_blacklist(self, blacklist, **attrs):
|
||||||
|
"""Update blacklist attributes
|
||||||
|
|
||||||
|
:param blacklist: The id or an instance of
|
||||||
|
:class: `~openstack.dns.v2.blacklist.Blacklist`.
|
||||||
|
:param attrs: attributes for update on
|
||||||
|
:class: `~openstack.dns.v2.blacklist.Blacklist`.
|
||||||
|
|
||||||
|
:rtype: :class: `~openstack.dns.v2.blacklist.Blacklist`.
|
||||||
|
"""
|
||||||
|
return self._update(_blacklist.Blacklist, blacklist, **attrs)
|
||||||
|
|
||||||
|
def delete_blacklist(self, blacklist, ignore_missing=True):
|
||||||
|
"""Delete a blacklist
|
||||||
|
|
||||||
|
:param blacklist: The id or an instance of
|
||||||
|
:class: `~openstack.dns.v2.blacklist.Blacklist`.
|
||||||
|
|
||||||
|
:returns: Blacklist been deleted
|
||||||
|
:rtype: :class:`~openstack.dns.v2.blacklist.Blacklist`
|
||||||
|
"""
|
||||||
|
return self._delete(
|
||||||
|
_blacklist.Blacklist, blacklist, ignore_missing=ignore_missing
|
||||||
|
)
|
||||||
|
47
openstack/dns/v2/blacklist.py
Normal file
47
openstack/dns/v2/blacklist.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
class Blacklist(_base.Resource):
|
||||||
|
"""DNS Blacklist Resource"""
|
||||||
|
|
||||||
|
resources_key = 'blacklists'
|
||||||
|
base_path = '/blacklists'
|
||||||
|
|
||||||
|
# capabilities
|
||||||
|
allow_list = True
|
||||||
|
allow_create = True
|
||||||
|
allow_fetch = True
|
||||||
|
allow_commit = True
|
||||||
|
allow_delete = True
|
||||||
|
commit_method = "PATCH"
|
||||||
|
|
||||||
|
_query_mapping = resource.QueryParameters(
|
||||||
|
'pattern',
|
||||||
|
)
|
||||||
|
|
||||||
|
#: Properties
|
||||||
|
#: ID for the resource
|
||||||
|
id = resource.Body('id')
|
||||||
|
#: Pattern for this blacklist
|
||||||
|
pattern = resource.Body('pattern')
|
||||||
|
#: Description for this blacklist
|
||||||
|
description = resource.Body("description")
|
||||||
|
#: Timestampe when the blacklist created
|
||||||
|
created_at = resource.Body("created_at")
|
||||||
|
#: Timestampe when the blacklist last updated
|
||||||
|
updated_at = resource.Body("updated_at")
|
||||||
|
#: Links to the resource, and the other related resources.
|
||||||
|
links = resource.Body("links")
|
61
openstack/tests/functional/dns/v2/test_blacklist.py
Normal file
61
openstack/tests/functional/dns/v2/test_blacklist.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# 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 openstack.dns.v2 import blacklist as _blacklist
|
||||||
|
from openstack.tests.functional import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestBlackList(base.BaseFunctionalTest):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.require_service('dns')
|
||||||
|
|
||||||
|
# Note: use a unique UUID pattern to avoid test collisions
|
||||||
|
self.pattern = rf".*\.test-{uuid.uuid4().hex}.com"
|
||||||
|
self.description = self.getUniqueString('blacklist')
|
||||||
|
|
||||||
|
def _delete_blacklist(self, blacklist):
|
||||||
|
ret = self.operator_cloud.dns.delete_blacklist(blacklist.id)
|
||||||
|
self.assertIsNone(ret)
|
||||||
|
|
||||||
|
def test_blacklist(self):
|
||||||
|
# create blacklist
|
||||||
|
blacklist = self.operator_cloud.dns.create_blacklist(
|
||||||
|
pattern=self.pattern,
|
||||||
|
description=self.description,
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(blacklist.id)
|
||||||
|
self.assertIsInstance(blacklist, _blacklist.Blacklist)
|
||||||
|
self.assertEqual(self.pattern, blacklist.pattern)
|
||||||
|
self.assertEqual(self.description, blacklist.description)
|
||||||
|
self.addCleanup(self._delete_blacklist, blacklist)
|
||||||
|
|
||||||
|
# update blacklist
|
||||||
|
blacklist = self.operator_cloud.dns.update_blacklist(
|
||||||
|
blacklist, pattern=self.pattern, description=self.description
|
||||||
|
)
|
||||||
|
self.assertIsInstance(blacklist, _blacklist.Blacklist)
|
||||||
|
self.assertEqual(self.pattern, blacklist.pattern)
|
||||||
|
self.assertEqual(self.description, blacklist.description)
|
||||||
|
|
||||||
|
# get blacklist
|
||||||
|
blacklist = self.operator_cloud.dns.get_blacklist(blacklist.id)
|
||||||
|
self.assertIsInstance(blacklist, _blacklist.Blacklist)
|
||||||
|
self.assertEqual(self.pattern, blacklist.pattern)
|
||||||
|
self.assertEqual(self.description, blacklist.description)
|
||||||
|
|
||||||
|
# list all blacklists
|
||||||
|
blacklists = list(self.operator_cloud.dns.blacklists())
|
||||||
|
self.assertIsInstance(blacklists[0], _blacklist.Blacklist)
|
||||||
|
self.assertIn(self.pattern, {x.pattern for x in blacklists})
|
||||||
|
self.operator_cloud.dns.delete_blacklist(blacklist.id)
|
41
openstack/tests/unit/dns/v2/test_blacklist.py
Normal file
41
openstack/tests/unit/dns/v2/test_blacklist.py
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# 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 blacklist
|
||||||
|
from openstack.tests.unit import base
|
||||||
|
|
||||||
|
IDENTIFIER = '373cb85e-0f4a-487a-846e-dce7a65cca4d'
|
||||||
|
EXAMPLE = {
|
||||||
|
'id': IDENTIFIER,
|
||||||
|
'description': 'blacklist test description',
|
||||||
|
'pattern': '.*example.com.',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TestBlackList(base.TestCase):
|
||||||
|
def test_basic(self):
|
||||||
|
sot = blacklist.Blacklist()
|
||||||
|
self.assertEqual(None, sot.resource_key)
|
||||||
|
self.assertEqual('blacklists', sot.resources_key)
|
||||||
|
self.assertEqual('/blacklists', sot.base_path)
|
||||||
|
self.assertTrue(sot.allow_list)
|
||||||
|
self.assertTrue(sot.allow_create)
|
||||||
|
self.assertTrue(sot.allow_fetch)
|
||||||
|
self.assertTrue(sot.allow_commit)
|
||||||
|
self.assertTrue(sot.allow_delete)
|
||||||
|
self.assertEqual('PATCH', sot.commit_method)
|
||||||
|
|
||||||
|
def test_make_it(self):
|
||||||
|
sot = blacklist.Blacklist(**EXAMPLE)
|
||||||
|
self.assertEqual(IDENTIFIER, sot.id)
|
||||||
|
self.assertEqual(EXAMPLE['description'], sot.description)
|
||||||
|
self.assertEqual(EXAMPLE['pattern'], sot.pattern)
|
@@ -11,6 +11,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from openstack.dns.v2 import _proxy
|
from openstack.dns.v2 import _proxy
|
||||||
|
from openstack.dns.v2 import blacklist
|
||||||
from openstack.dns.v2 import floating_ip
|
from openstack.dns.v2 import floating_ip
|
||||||
from openstack.dns.v2 import recordset
|
from openstack.dns.v2 import recordset
|
||||||
from openstack.dns.v2 import service_status
|
from openstack.dns.v2 import service_status
|
||||||
@@ -363,3 +364,32 @@ class TestDnsTsigKey(TestDnsProxy):
|
|||||||
|
|
||||||
def test_tesigkeys(self):
|
def test_tesigkeys(self):
|
||||||
self.verify_list(self.proxy.tsigkeys, tsigkey.TSIGKey)
|
self.verify_list(self.proxy.tsigkeys, tsigkey.TSIGKey)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDnsBlacklist(TestDnsProxy):
|
||||||
|
def test_blacklist_create(self):
|
||||||
|
self.verify_create(
|
||||||
|
self.proxy.create_blacklist,
|
||||||
|
blacklist.Blacklist,
|
||||||
|
method_kwargs={'pattern': '.*\.example\.com'},
|
||||||
|
expected_kwargs={
|
||||||
|
'pattern': '.*\.example\.com',
|
||||||
|
'prepend_key': False,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_blacklist_delete(self):
|
||||||
|
self.verify_delete(
|
||||||
|
self.proxy.delete_blacklist,
|
||||||
|
blacklist.Blacklist,
|
||||||
|
ignore_missing=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_blacklist_update(self):
|
||||||
|
self.verify_update(self.proxy.update_blacklist, blacklist.Blacklist)
|
||||||
|
|
||||||
|
def test_blacklist_get(self):
|
||||||
|
self.verify_get(self.proxy.get_blacklist, blacklist.Blacklist)
|
||||||
|
|
||||||
|
def test_blacklists(self):
|
||||||
|
self.verify_list(self.proxy.blacklists, blacklist.Blacklist)
|
||||||
|
Reference in New Issue
Block a user