Eliminate Master/Slave terminology from Designate Zone resource

Change-Id: If136f5e270db5df1f871dc9473afb178e242bc18
This commit is contained in:
Zane Bitter 2020-07-14 17:32:07 -04:00
parent 9f931119ba
commit a3eeefb6d7
3 changed files with 125 additions and 6 deletions

View File

@ -18,6 +18,7 @@ from heat.engine import constraints
from heat.engine import properties from heat.engine import properties
from heat.engine import resource from heat.engine import resource
from heat.engine import support from heat.engine import support
from heat.engine import translation
class DesignateZone(resource.Resource): class DesignateZone(resource.Resource):
@ -31,9 +32,9 @@ class DesignateZone(resource.Resource):
version='8.0.0') version='8.0.0')
PROPERTIES = ( PROPERTIES = (
NAME, TTL, DESCRIPTION, EMAIL, TYPE, MASTERS NAME, TTL, DESCRIPTION, EMAIL, TYPE, PRIMARIES, MASTERS
) = ( ) = (
'name', 'ttl', 'description', 'email', 'type', 'masters' 'name', 'ttl', 'description', 'email', 'type', 'primaries', 'masters'
) )
ATTRIBUTES = ( ATTRIBUTES = (
@ -80,17 +81,28 @@ class DesignateZone(resource.Resource):
TYPE: properties.Schema( TYPE: properties.Schema(
properties.Schema.STRING, properties.Schema.STRING,
_('Type of zone. PRIMARY is controlled by Designate, SECONDARY ' _('Type of zone. PRIMARY is controlled by Designate, SECONDARY '
'zones are slaved from another DNS Server.'), 'zones are transferred from another DNS Server.'),
default=PRIMARY, default=PRIMARY,
constraints=[constraints.AllowedValues( constraints=[constraints.AllowedValues(
allowed=TYPES)] allowed=TYPES)]
), ),
MASTERS: properties.Schema( MASTERS: properties.Schema(
properties.Schema.LIST, properties.Schema.LIST,
_('The servers to slave from to get DNS information and is ' _('The primary servers to transfer DNS zone information from. '
'mandatory for zone type SECONDARY, otherwise ignored.'), 'Mandatory for zone type SECONDARY, otherwise ignored.'),
update_allowed=True,
support_status=support.SupportStatus(
status=support.DEPRECATED,
version='15.0.0',
message=_('Use ``primaries`` instead.')
)
),
PRIMARIES: properties.Schema(
properties.Schema.LIST,
_('The primary servers to transfer DNS zone information from. '
'Mandatory for zone type SECONDARY, otherwise ignored.'),
update_allowed=True update_allowed=True
) ),
} }
attributes_schema = { attributes_schema = {
@ -120,6 +132,17 @@ class DesignateZone(resource.Resource):
raise_invalid_exception(self.PRIMARY, self.EMAIL) raise_invalid_exception(self.PRIMARY, self.EMAIL)
raise_invalid_exception(self.SECONDARY, self.MASTERS) raise_invalid_exception(self.SECONDARY, self.MASTERS)
def translation_rules(self, props):
return [
# Translate to "masters" as that is what the Designate API uses,
# even though we have deprecated that name for the property
# in favour of "primaries".
translation.TranslationRule(props,
translation.TranslationRule.REPLACE,
translation_path=[self.MASTERS],
value_name=self.PRIMARIES)
]
def handle_create(self): def handle_create(self):
args = dict((k, v) for k, v in self.properties.items() if v) args = dict((k, v) for k, v in self.properties.items() if v)
args['type_'] = args.pop(self.TYPE) args['type_'] = args.pop(self.TYPE)

View File

@ -211,3 +211,94 @@ class DesignateZoneTest(common.HeatTestCase):
self.test_client.zones.get.assert_called_once_with( self.test_client.zones.get.assert_called_once_with(
self.test_resource.resource_id self.test_resource.resource_id
) )
class DesignateSecondaryZoneTest(common.HeatTestCase):
def setUp(self):
super(DesignateSecondaryZoneTest, self).setUp()
self.ctx = utils.dummy_context()
self.primaries = ['::1']
def _get_mock_resource(self):
value = {}
value['id'] = '477e8273-60a7-4c41-b683-fdb0bc7cd152'
value['serial'] = '1434596972'
return value
def test_masters(self):
self.do_test({
'heat_template_version': '2015-04-30',
'resources': {
'test_resource': {
'type': 'OS::Designate::Zone',
'properties': {
'name': 'test-zone.com',
'description': 'Test zone',
'ttl': 3600,
'email': 'abc@test-zone.com',
'type': 'SECONDARY',
'masters': self.primaries,
}
}
}
})
def test_primaries(self):
self.do_test({
'heat_template_version': '2015-04-30',
'resources': {
'test_resource': {
'type': 'OS::Designate::Zone',
'properties': {
'name': 'test-zone.com',
'description': 'Test zone',
'ttl': 3600,
'email': 'abc@test-zone.com',
'type': 'SECONDARY',
'primaries': self.primaries,
}
}
}
})
def do_test(self, sample_template):
self.stack = stack.Stack(
self.ctx, 'test_stack',
template.Template(sample_template)
)
self.test_resource = self.stack['test_resource']
# Mock client plugin
self.test_client_plugin = mock.MagicMock()
self.test_resource.client_plugin = mock.MagicMock(
return_value=self.test_client_plugin)
# Mock client
self.test_client = mock.MagicMock()
self.test_resource.client = mock.MagicMock(
return_value=self.test_client)
mock_zone_create = self.test_client.zones.create
mock_resource = self._get_mock_resource()
mock_zone_create.return_value = mock_resource
self.test_resource.data_set = mock.Mock()
self.test_resource.handle_create()
args = dict(
name='test-zone.com',
description='Test zone',
ttl=3600,
email='abc@test-zone.com',
type_='SECONDARY',
masters=self.primaries
)
mock_zone_create.assert_called_once_with(**args)
# validate physical resource id
self.assertEqual(mock_resource['id'], self.test_resource.resource_id)

View File

@ -0,0 +1,5 @@
---
deprecations:
- |
The ``OS::Designate::Zone`` resource type's ``masters`` property is now
known as ``primaries``. Existing templates will continue to work.