После обновления PowerDNS с 4.0.x до 4.1.x удаление rrset через API должно произойти до замены
Мы используем PowerDNS REST API для управления зонами наших клиентов. После обновления с версии 4.0.x до 4.1.x авторитетного сервера имен кажется, что API требует, чтобы мы отправляли удаления rrset перед заменами, когда существует конфликтующая запись. Вот пример (это фактический JSON, только несколько клиентских хостов и IP были отредактированы).
Сначала GET зоны перед обновлением:
{
"account": "admin",
"api_rectify": false,
"dnssec": false,
"id": "example.com.",
"kind": "Master",
"last_check": 1438206353,
"masters": [],
"name": "example.com.",
"notified_serial": 1440009663,
"nsec3narrow": false,
"nsec3param": "",
"rrsets": [
{
"comments": [],
"name": "www.example.com.",
"records": [
{
"content": "77.77.77.77",
"disabled": false
}
],
"ttl": 21600,
"type": "A"
},
{
"comments": [],
"name": "example.com.",
"records": [
{
"content": "5 mailer.example.com.",
"disabled": false
}
],
"ttl": 21600,
"type": "MX"
},
{
"comments": [],
"name": "example.com.",
"records": [
{
"content": "hosting.webnames.ca. postmaster.webnames.ca. 1440009663 21600 180 1209600 3600",
"disabled": false
}
],
"ttl": 21600,
"type": "SOA"
},
{
"comments": [],
"name": "example.com.",
"records": [
{
"content": "ns1.webnames.ca.",
"disabled": false
},
{
"content": "ns2.webnames.ca.",
"disabled": false
},
{
"content": "ns3.webnames.ca.",
"disabled": false
}
],
"ttl": 21600,
"type": "NS"
},
{
"comments": [],
"name": "example.com.",
"records": [
{
"content": "77.77.77.77",
"disabled": false
}
],
"ttl": 21600,
"type": "A"
}
],
"serial": 1440009663,
"soa_edit": "",
"soa_edit_api": "",
"url": "/api/v1/servers/localhost/zones/example.com."
}
Затем обновление PATCH, которое завершается неудачно:
{
"rrsets": [
{
"name": "example.com.",
"type": "A",
"ttl": 900,
"records": [
{
"content": "209.15.37.6",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "example.com.",
"type": "NS",
"ttl": 900,
"records": [
{
"content": "ns1.webnames.ca.",
"disabled": false,
"set-ptr": false
},
{
"content": "ns2.webnames.ca.",
"disabled": false,
"set-ptr": false
},
{
"content": "ns3.webnames.ca.",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "example.com.",
"type": "SOA",
"ttl": 21600,
"records": [
{
"content": "ns1.webnames.ca. postmaster.webnames.ca. 1531346965 21600 180 1209600 3600",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "www.example.com.",
"type": "CNAME",
"ttl": 900,
"records": [
{
"content": "example.com.",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "www.example.com.",
"type": "A",
"records": [],
"comments": [],
"changetype": "DELETE"
},
{
"name": "example.com.",
"type": "MX",
"records": [],
"comments": [],
"changetype": "DELETE"
}
]
}
Возвращенная ошибка:
{"error": "RRset www.example.com. IN CNAME: Conflicts with pre-existing non-CNAME RRset"}
Очевидно, это связано с тем, что запись A на сайте www.example.com удаляется только в конце списка rrset. Поэтому, если мы снова сделаем обновление PATCH, но на этот раз с DELETE rrsets в начале, это сработает:
{
"rrsets": [
{
"name": "www.example.com.",
"type": "A",
"records": [],
"comments": [],
"changetype": "DELETE"
},
{
"name": "example.com.",
"type": "MX",
"records": [],
"comments": [],
"changetype": "DELETE"
},
{
"name": "example.com.",
"type": "A",
"ttl": 900,
"records": [
{
"content": "209.15.37.6",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "example.com.",
"type": "NS",
"ttl": 900,
"records": [
{
"content": "ns1.webnames.ca.",
"disabled": false,
"set-ptr": false
},
{
"content": "ns2.webnames.ca.",
"disabled": false,
"set-ptr": false
},
{
"content": "ns3.webnames.ca.",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "example.com.",
"type": "SOA",
"ttl": 21600,
"records": [
{
"content": "ns1.webnames.ca. postmaster.webnames.ca. 1531346965 21600 180 1209600 3600",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
},
{
"name": "www.example.com.",
"type": "CNAME",
"ttl": 900,
"records": [
{
"content": "example.com.",
"disabled": false,
"set-ptr": false
}
],
"comments": null,
"changetype": "REPLACE"
}
]
}
Я не видел этого в документации, и это довольно серьезное изменение для нашего варианта использования. Для API имеет смысл сначала обработать DELETE rrsets, чтобы избежать таких коллизий. Может быть, это связано с одним или обоими из этих двух элементов из https://doc.powerdns.com/authoritative/changelog/4.1.html:
- Запретить смешивание CNAME и других RRSets в API (Кристан Хофштадтлер).
- Рекомендации: #5305, запрос на выдачу 5389
- Предотвращение дублирования записей в одном RRset (Кристиан Хофштадтлер).
- Рекомендации: тянуть запрос 4195
Поэтому я предполагаю, что мой вопрос: это предполагаемое поведение? Это задокументировано где-то еще, что я пропустил? Должен ли я сообщить об ошибке по этому поводу, или мой обходной путь - это просто здравый смысл, который должен реализовать каждый?