Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support of update without identifier to Yandex PDD #1253

Merged
merged 2 commits into from
May 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions lexicon/providers/yandex.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,15 +115,15 @@ def _list_records(self, rtype=None, name=None, content=None):
LOGGER.debug("list_records: %s", records)
return records

# Just update existing record. Domain ID (domain) and Identifier (record_id) is mandatory
# Just update existing record. If Identifier is not provided, update the latest entry with matching name and rtype.
def _update_record(self, identifier, rtype=None, name=None, content=None):

if not identifier:
LOGGER.debug(
"Domain ID (domain) and Identifier (record_id) "
"is mandatory parameters for this case"
)
return False
# get existing entries, and pick the last one for update
records = self._list_records(rtype=rtype, name=name)
if not records:
return False
identifier = records[-1]["id"]

data = ""
if rtype:
Expand Down
17 changes: 8 additions & 9 deletions lexicon/tests/providers/test_yandex.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
"""Integration tests for Yandex PDD"""
from unittest import TestCase

import pytest

from lexicon.tests.providers.integration_tests import IntegrationTestsV2


Expand All @@ -13,15 +11,16 @@ class YandexPDDProviderTests(TestCase, IntegrationTestsV2):
"""TestCase for Yandex PDD"""

provider_name = "yandex"
domain = "capsulecd.com"
domain = "example.com"

def _filter_headers(self):
"""Sensitive headers to be filtered."""
return ["Authorization", "PddToken"]

# TODO: enable the skipped tests
@pytest.mark.skip(reason="new test, missing recording")
def test_provider_when_calling_update_record_should_modify_record_name_specified(
self,
):
return
# filter out data which change on each run
def _filter_response(self, response):
if "X-Request-Id" in response["headers"]:
del response["headers"]["X-Request-Id"]
if "X-qloud-router" in response["headers"]:
del response["headers"]["X-qloud-router"]
return response
40 changes: 22 additions & 18 deletions tests/cleanup.sh
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
#!/bin/sh
PROVIDER_NAME=rage4
TEST_DOMAIN=capsulecd.com
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.createrecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.deleterecordinset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.deleterecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.fqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.full.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.listrecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.noop.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name _acme-challenge.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name random.fqdntest.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name random.fulltest.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name random.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name updated.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name updated.testfqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name updated.testfull.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com A --name localhost.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com TXT --name ttl.fqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete capsulecd.com CNAME --name docs.${TEST_DOMAIN}
TEST_DOMAIN=example.com
#AUTH="--auth-token=XXX"
echo "Cleaning up domain ${TEST_DOMAIN} in ${PROVIDER_NAME}"
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.createrecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.deleterecordinset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.deleterecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.fqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.full.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.listrecordset.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.noop.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name _acme-challenge.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name random.fqdntest.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name random.fulltest.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name random.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name updated.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name updated.testfqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name updated.testfull.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name orig.nameonly.test.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} A ${AUTH} --name localhost.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} TXT ${AUTH} --name ttl.fqdn.${TEST_DOMAIN}
lexicon ${PROVIDER_NAME} delete ${TEST_DOMAIN} CNAME ${AUTH} --name docs.${TEST_DOMAIN}
Original file line number Diff line number Diff line change
@@ -1,66 +1,38 @@
interactions:
- request:
body: !!python/unicode '{}'
body: '{}'
headers:
Accept: [application/json]
Accept-Encoding: ['gzip, deflate']
Connection: [keep-alive]
Content-Length: ['2']
Content-Type: [application/json]
User-Agent: [python-requests/2.9.1]
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
Content-Length:
- '2'
Content-Type:
- application/json
User-Agent:
- python-requests/2.27.1
method: GET
uri: https://pddimp.yandex.ru/api2/admin/dns/list?domain=capsulecd.com
uri: https://pddimp.yandex.ru/api2/admin/dns/list?domain=example.com
response:
body: {string: !!python/unicode '{"records": [{"content": "mx.yandex.net.", "domain":
"capsulecd.com", "fqdn": "capsulecd.com", "priority": 10, "ttl": 21600, "record_id":
39559783, "subdomain": "@", "type": "MX"}, {"content": "dns1.yandex.net.",
"domain": "capsulecd.com", "fqdn": "capsulecd.com", "priority": "", "ttl":
21600, "record_id": 39559782, "subdomain": "@", "type": "NS"}, {"content":
"dns2.yandex.net.", "domain": "capsulecd.com", "fqdn": "capsulecd.com", "priority":
"", "ttl": 21600, "record_id": 39559781, "subdomain": "@", "type": "NS"},
{"content": "dns1.yandex.net.", "domain": "capsulecd.com", "retry": 900, "fqdn":
"capsulecd.com", "refresh": 14400, "admin_mail": "lexicon.test.yandex.ru",
"priority": "", "expire": 1209600, "ttl": 21600, "record_id": 39559780, "subdomain":
"@", "type": "SOA", "minttl": 14400}, {"content": "v=spf1 redirect=_spf.yandex.net",
"domain": "capsulecd.com", "fqdn": "capsulecd.com", "priority": "", "ttl":
21600, "record_id": 39559784, "subdomain": "@", "type": "TXT"}, {"content":
"domain.mail.yandex.net.", "domain": "capsulecd.com", "fqdn": "mail.capsulecd.com",
"priority": "", "ttl": 21600, "record_id": 39559969, "subdomain": "mail",
"type": "CNAME"}, {"content": "104.31.76.164", "domain": "capsulecd.com",
"fqdn": "www.capsulecd.com", "priority": "", "ttl": 21600, "record_id": 39559785,
"subdomain": "www", "type": "A"}, {"content": "104.31.77.164", "domain": "capsulecd.com",
"fqdn": "www.capsulecd.com", "priority": "", "ttl": 21600, "record_id": 39559786,
"subdomain": "www", "type": "A"}, {"content": "2400:cb00:2048:1::681f:4ca4",
"domain": "capsulecd.com", "fqdn": "www.capsulecd.com", "priority": "", "ttl":
21600, "record_id": 39559791, "subdomain": "www", "type": "AAAA"}, {"content":
"2400:cb00:2048:1::681f:4da4", "domain": "capsulecd.com", "fqdn": "www.capsulecd.com",
"priority": "", "ttl": 21600, "record_id": 39559792, "subdomain": "www", "type":
"AAAA"}, {"content": "domain-xmpp.yandex.net.", "domain": "capsulecd.com",
"weight": 0, "fqdn": "_xmpp-client._tcp.capsulecd.com", "port": 5222, "priority":
20, "ttl": 21600, "record_id": 39559787, "subdomain": "_xmpp-client._tcp",
"type": "SRV"}, {"content": "domain-xmpp.yandex.net.", "domain": "capsulecd.com",
"weight": 0, "fqdn": "_xmpp-client._tcp.conference.capsulecd.com", "port":
5222, "priority": 20, "ttl": 21600, "record_id": 39559789, "subdomain": "_xmpp-client._tcp.conference",
"type": "SRV"}, {"content": "domain-xmpp.yandex.net.", "domain": "capsulecd.com",
"weight": 0, "fqdn": "_xmpp-server._tcp.capsulecd.com", "port": 5269, "priority":
20, "ttl": 21600, "record_id": 39559788, "subdomain": "_xmpp-server._tcp",
"type": "SRV"}, {"content": "domain-xmpp.yandex.net.", "domain": "capsulecd.com",
"weight": 0, "fqdn": "_xmpp-server._tcp.conference.capsulecd.com", "port":
5269, "priority": 20, "ttl": 21600, "record_id": 39559790, "subdomain": "_xmpp-server._tcp.conference",
"type": "SRV"}], "domain": "capsulecd.com", "success": "ok"}

'}
body:
string: '{"domain": "example.com", "records": [], "success": "ok"}'
headers:
connection: [keep-alive]
content-disposition: [attachment; filename="json.txt"; filename*=UTF-8''json.txt]
content-length: ['2941']
content-security-policy: [default-src 'none']
content-type: [application/json; charset=utf-8]
date: ['Tue, 24 Jan 2017 05:40:37 GMT']
server: [nginx/1.8.1]
strict-transport-security: [max-age=31536000]
transfer-encoding: [chunked]
x-content-type-options: [nosniff]
x-frame-options: [SAMEORIGIN]
status: {code: 200, message: OK}
Connection:
- keep-alive
Content-Length:
- '56'
Content-Type:
- application/json; charset=utf-8
Date:
- Mon, 16 May 2022 17:47:57 GMT
Keep-Alive:
- timeout=120
Server:
- nginx
status:
code: 200
message: OK
version: 1
Original file line number Diff line number Diff line change
@@ -1,30 +1,38 @@
interactions:
- request:
body: !!python/unicode '{}'
body: '{}'
headers:
Accept: [application/json]
Accept-Encoding: ['gzip, deflate']
Connection: [keep-alive]
Content-Length: ['2']
Content-Type: [application/json]
User-Agent: [python-requests/2.9.1]
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
Content-Length:
- '2'
Content-Type:
- application/json
User-Agent:
- python-requests/2.27.1
method: GET
uri: https://pddimp.yandex.ru/api2/admin/dns/list?domain=thisisadomainidonotown.com
response:
body: {string: !!python/unicode '{"domain": "thisisadomainidonotown.com", "success":
"error", "error": "not_allowed"}

'}
body:
string: '{"success": "error", "error": "no_such_domain", "domain": "thisisadomainidonotown.com"}'
headers:
connection: [keep-alive]
content-disposition: [attachment; filename="json.txt"; filename*=UTF-8''json.txt]
content-length: ['85']
content-security-policy: [default-src 'none']
content-type: [application/json; charset=utf-8]
date: ['Tue, 24 Jan 2017 05:41:04 GMT']
server: [nginx/1.8.1]
strict-transport-security: [max-age=31536000]
x-content-type-options: [nosniff]
x-frame-options: [SAMEORIGIN]
status: {code: 200, message: OK}
Connection:
- keep-alive
Content-Length:
- '87'
Content-Type:
- application/json; charset=utf-8
Date:
- Mon, 16 May 2022 17:47:57 GMT
Keep-Alive:
- timeout=120
Server:
- nginx
status:
code: 200
message: OK
version: 1
Loading