Skip to content

Commit

Permalink
Merge pull request #46 from dchudik/main
Browse files Browse the repository at this point in the history
Added DNAME and CAA records
  • Loading branch information
ross authored Mar 21, 2024
2 parents 89846df + a0a9bf4 commit 7286ef4
Show file tree
Hide file tree
Showing 4 changed files with 178 additions and 4 deletions.
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pip install octodns octodns-selectel

| What | Value |
|-------------------|---------------------------------------------------|
| Supported records | A, AAAA, ALIAS, CNAME, MX, NS, SRV, SSHFP, TXT |
| Supported records | A, AAAA, ALIAS, CAA, CNAME, DNAME, MX, NS, SRV, SSHFP, TXT |
| Dynamic records ||

## Configuration
Expand Down Expand Up @@ -111,6 +111,19 @@ _sip._tcp:
target: phone2.example.com.
weight: 0
caa:
- ttl: 3600
type: CAA
values:
- flags: 0
tag: issue
value: octodns-test.com.
dname:
- ttl: 3600
type: DNAME
value: octodns-test.com.
foo:
- ttl: 3600
type: CNAME
Expand Down
20 changes: 18 additions & 2 deletions octodns_selectel/v2/mappings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,30 @@
def to_selectel_rrset(record):
rrset = dict(name=record.fqdn, ttl=record.ttl, type=record._type)
rrset_records = []
content_caa_tmpl = Template("$flag $tag \"$value\"")
content_mx_tmpl = Template("$preference $exchange")
content_srv_tmpl = Template("$priority $weight $port $target")
content_sshfp_tmpl = Template("$algorithm $fingerprint_type $fingerprint")
if record._type in {"A", "AAAA", "NS"}:
rrset_records = list(
map(lambda value: {'content': value}, record.values)
)
elif record._type in {"CNAME", "ALIAS"}:
elif record._type in {"CNAME", "ALIAS", "DNAME"}:
rrset_records = [{'content': record.value}]
elif record._type == "TXT":
rrset_records = [
dict(content=f'\"{unescape_semicolon(value)}\"')
for value in record.values
]
elif record._type == "CAA":
rrset_records = [
dict(
content=content_caa_tmpl.substitute(
flag=value.flags, tag=value.tag, value=value.value
)
)
for value in record.values
]
elif record._type == "MX":
rrset_records = list(
map(
Expand Down Expand Up @@ -78,14 +88,20 @@ def to_octodns_record_data(rrset):
key_for_record_values = "values"
if rrset_type in {"A", "AAAA", "NS"}:
record_values = [r['content'] for r in rrset["records"]]
elif rrset_type in {"CNAME", "ALIAS"}:
elif rrset_type in {"CNAME", "ALIAS", "DNAME"}:
key_for_record_values = "value"
record_values = rrset["records"][0]["content"]
elif rrset_type == "TXT":
record_values = [
escape_semicolon(r['content']).strip('"\'')
for r in rrset["records"]
]
elif rrset_type == "CAA":
for record in rrset["records"]:
flag, tag, value = record["content"].split(" ")
record_values.append(
{'flags': flag, 'tag': tag, 'value': value.strip("\"")}
)
elif rrset_type == "MX":
for record in rrset["records"]:
preference, exchange = record["content"].split(" ")
Expand Down
14 changes: 13 additions & 1 deletion octodns_selectel/v2/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,19 @@
class SelectelProvider(BaseProvider):
SUPPORTS_GEO = False
SUPPORTS = set(
('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NS', 'TXT', 'SRV', 'SSHFP')
(
'A',
'AAAA',
'ALIAS',
'CAA',
'CNAME',
'DNAME',
'MX',
'NS',
'TXT',
'SRV',
'SSHFP',
)
)
MIN_TTL = 60

Expand Down
133 changes: 133 additions & 0 deletions tests/v2/test_selectel_mappings.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
AaaaRecord,
AliasRecord,
ARecord,
CaaRecord,
CnameRecord,
DnameRecord,
MxRecord,
SrvRecord,
SshfpRecord,
Expand Down Expand Up @@ -159,6 +161,42 @@ def _assert_mapping_sshfp(self, test_pairs):
list(map(lambda value: value.rdata_text, tc.record.values)),
)

def _caa_to_string(self, caa):
return f'{caa["flags"]} {caa["tag"]} {caa["value"]}'

def _assert_mapping_caa(self, test_pairs):
for tc in test_pairs:
with self.subTest():
rrset_from_record = to_selectel_rrset(tc.record)
self.assertListEqual(
list(
map(
lambda value: value.get("content"),
rrset_from_record.get("records"),
)
),
# octodns class CaaRecord __repr__ output with quotes
# and selectel backend use quotes
list(map(lambda value: str(value), tc.record.values)),
)

record_data_from_rrset = to_octodns_record_data(tc.rrset)
self.assertListEqual(
sorted(
list(
map(
lambda caa_value: self._caa_to_string(
caa_value
),
record_data_from_rrset.get("values"),
)
)
),
# octodns class CaaRecord __repr__ output with quotes
# but rdata_text output without quotes
list(map(lambda value: value.rdata_text, tc.record.values)),
)

def _assert_mapping_value(self, test_pairs):
for tc in test_pairs:
with self.subTest():
Expand Down Expand Up @@ -518,6 +556,39 @@ def test_mapping_record_cname(self):
self._assert_mapping_common(test_pairs)
self._assert_mapping_value(test_pairs)

def test_mapping_record_dname(self):
dname_value = f"a.{self.zone.name}"
test_pairs = (
PairTest(
DnameRecord(
self.zone,
"dname",
dict(type="DNAME", ttl=self.ttl, value=dname_value),
),
dict(
name=f"dname.{self.zone.name}",
ttl=self.ttl,
type="DNAME",
records=[dict(content=dname_value)],
),
),
PairTest(
DnameRecord(
self.zone,
"",
dict(type="DNAME", ttl=self.ttl, value=dname_value),
),
dict(
name=self.zone.name,
ttl=self.ttl,
type="DNAME",
records=[dict(content=dname_value)],
),
),
)
self._assert_mapping_common(test_pairs)
self._assert_mapping_value(test_pairs)

def test_mapping_record_alias(self):
cname_value = "proxydomain.ru."
test_pairs = (
Expand Down Expand Up @@ -551,6 +622,68 @@ def test_mapping_record_alias(self):
self._assert_mapping_common(test_pairs)
self._assert_mapping_value(test_pairs)

def test_mapping_record_caa(self):
caa_list_dict = [
dict(flags="0", tag="issue", value="ca.example.net"),
dict(flags="0", tag="issue", value=";"),
dict(
flags="0", tag="iodef", value="mailto:[email protected]"
),
]
caa_list_str = [
self._caa_to_string(caa_dict_item)
for caa_dict_item in caa_list_dict
]
test_pairs = (
PairTest(
CaaRecord(
self.zone,
"caa",
dict(type="CAA", ttl=self.ttl, value=caa_list_dict[0]),
),
dict(
name=f"caa.{self.zone.name}",
ttl=self.ttl,
type="CAA",
records=[dict(content=caa_list_str[0])],
),
),
PairTest(
CaaRecord(
self.zone,
"caa",
dict(type="CAA", ttl=self.ttl, values=caa_list_dict),
),
dict(
name=f"caa.{self.zone.name}",
ttl=self.ttl,
type="CAA",
records=[
dict(content=caa_str_item)
for caa_str_item in caa_list_str
],
),
),
PairTest(
CaaRecord(
self.zone,
"",
dict(type="CAA", ttl=self.ttl, values=caa_list_dict),
),
dict(
name=self.zone.name,
ttl=self.ttl,
type="CAA",
records=[
dict(content=caa_str_item)
for caa_str_item in caa_list_str
],
),
),
)
self._assert_mapping_common(test_pairs)
self._assert_mapping_caa(test_pairs)

def test_mapping_record_raise_exception_invalid_type(self):
invalid_type_record = ARecord(
self.zone,
Expand Down

0 comments on commit 7286ef4

Please sign in to comment.