CloudStack DNS framework - Integrate PowerDNS as first plugin#12737
CloudStack DNS framework - Integrate PowerDNS as first plugin#12737sudo87 wants to merge 62 commits intoapache:mainfrom
Conversation
2. added relevant changes in dao and vo 3. worked on creatednszone, integration with mgr 4. powerdns create zone api call
1. creatednszone 2. listdnszone 3. updatednszone 4. deletednszone
1. Add dns server 2. create zone 3. add records 4. verify in powerdns 5. verify using dig
1. Registerdnsrecordforvm api 2. removednsrecordforvm api 3. cleanup; fixed license, dao logic
1. refactored client 2. added exceptions 3. enhanced updateZone 4. ownership check for deleteDnsServer
…n svc and handle dot version in client
…elete events 2. add dnsrecordurl in nic_details table 3. add dnsrecordurl in vm response
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #12737 +/- ##
============================================
+ Coverage 18.03% 18.33% +0.29%
- Complexity 16648 17070 +422
============================================
Files 6035 6093 +58
Lines 542487 545399 +2912
Branches 66477 66785 +308
============================================
+ Hits 97854 100010 +2156
- Misses 433612 434259 +647
- Partials 11021 11130 +109
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch. |
741a410 to
8e9fe78
Compare
8e9fe78 to
8d365cb
Compare
|
This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch. |
|
@blueorangutan package |
|
@sudo87 a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress. |
|
Packaging result [SF]: ✖️ el8 ✖️ el9 ✔️ debian ✖️ suse15. SL-JID 17671 |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 17674 |
…of zones from dns provider
|
Hi @weizhouapache, there are new params introduced in following commands apart from minor fixes:
Please review and share your feedback. |
|
@blueorangutan package |
|
@sudo87 a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress. |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 17682 |
|
[SF] Trillian test result (tid-15994)
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR introduces a new plugin-based DNS framework to CloudStack, adds initial PowerDNS support, and exposes DNS server/zone/record management via new APIs plus UI integration.
Changes:
- Added new DNS management APIs, response types, and server-side persistence (DAOs/VOs) for DNS servers/zones and network associations.
- Implemented UI views/actions for managing DNS zones/servers and surfaced NIC DNS names.
- Added schema migrations and SQL views to persist and query DNS integration data, plus a PowerDNS plugin module.
Reviewed changes
Copilot reviewed 131 out of 132 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| ui/src/views/network/dns/UpdateDnsZone.vue | UI modal/form to update DNS zone metadata (description). |
| ui/src/views/network/dns/DeleteDnsZone.vue | UI confirmation flow to delete/unmanage a DNS zone. |
| ui/src/views/network/NicsTable.vue | Displays NIC DNS name in NIC details. |
| ui/src/components/view/ListView.vue | Adjusts list rendering for DNS server list and enables list-view routing for dnsserver/dnszone. |
| ui/src/components/view/DetailsTab.vue | Adds explicit provider rendering for DNS server details. |
| tools/apidoc/gen_toc.py | Adds “Dns” section label for API documentation TOC generation. |
| server/src/test/java/org/apache/cloudstack/dns/vo/DnsZoneJoinVOTest.java | Unit tests for DNS zone join view VO getters/defaults. |
| server/src/test/java/org/apache/cloudstack/dns/vo/DnsServerVOTest.java | Unit tests for DNS server VO behavior (masking, parsing, constructors). |
| server/src/test/java/org/apache/cloudstack/dns/vo/DnsServerJoinVOTest.java | Unit tests for DNS server join view VO getters/defaults. |
| server/src/test/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImplTest.java | Unit tests for DNS zone ↔ network mapping DAO methods. |
| server/src/test/java/org/apache/cloudstack/dns/dao/DnsZoneDaoImplTest.java | Unit tests for DNS zone DAO queries and search. |
| server/src/test/java/org/apache/cloudstack/dns/dao/DnsServerDaoImplTest.java | Unit tests for DNS server DAO queries and search. |
| server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml | Registers the DNS provider manager in server core Spring context. |
| server/src/main/java/org/apache/cloudstack/dns/vo/NicDnsJoinVO.java | Adds DB view VO for NIC DNS data joined with zone/network mapping. |
| server/src/main/java/org/apache/cloudstack/dns/vo/DnsZoneVO.java | Adds DNS zone persistence model and implements DnsZone interface. |
| server/src/main/java/org/apache/cloudstack/dns/vo/DnsZoneNetworkMapVO.java | Adds persistence model for zone ↔ network association and subdomain. |
| server/src/main/java/org/apache/cloudstack/dns/vo/DnsZoneJoinVO.java | Adds query view VO for DNS zone listing/details. |
| server/src/main/java/org/apache/cloudstack/dns/vo/DnsServerJoinVO.java | Adds query view VO for DNS server listing/details. |
| server/src/main/java/org/apache/cloudstack/dns/vo/DnsServerDetailVO.java | Adds details table VO for DNS server key/value details. |
| server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDaoImpl.java | Implements DAO for querying NIC DNS join view for collision/sync logic. |
| server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDao.java | DAO contract for NIC DNS join view queries used by DNS workflows. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImpl.java | Implements DAO for zone ↔ network mappings. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java | DAO interface for zone ↔ network mapping operations. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneJoinDaoImpl.java | Adds join DAO impl for DNS zone view. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneJoinDao.java | Adds join DAO interface for DNS zone view. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneDaoImpl.java | Implements DNS zone DAO queries and search. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneDao.java | DAO interface for DNS zone persistence queries. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsServerJoinDaoImpl.java | Adds join DAO impl for DNS server view. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsServerJoinDao.java | Adds join DAO interface for DNS server view. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsServerDetailsDaoImpl.java | Implements details DAO for DNS server details. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsServerDetailsDao.java | DAO interface for DNS server details. |
| server/src/main/java/org/apache/cloudstack/dns/dao/DnsServerDao.java | DNS server DAO interface (search, details load/save, etc.). |
| server/src/main/java/com/cloud/user/AccountManagerImpl.java | Extends access-check exclusions for DNS entities. |
| server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java | Fixes indentation/formatting in firewall rule listing query builder. |
| server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java | Adds nic_dns_name projection to VM join view VO. |
| server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java | Populates NIC response with nicDnsName from join VO. |
| server/src/main/java/com/cloud/api/ApiResponseHelper.java | Adds DNS zone/subdomain fields to network response. |
| server/src/main/java/com/cloud/api/ApiDBUtils.java | Adds DB utils wiring and lookup for DNS zone by network ID. |
| server/src/main/java/com/cloud/acl/DomainChecker.java | Adds DNS entities permission checks via DnsProviderManager. |
| plugins/pom.xml | Registers new PowerDNS plugin module under plugins build. |
| plugins/dns/powerdns/src/test/java/org/apache/cloudstack/dns/DnsProviderUtilTest.java | Adds parameterized tests for DNS provider utility normalization/suffix logic. |
| plugins/dns/powerdns/src/main/resources/META-INF/cloudstack/powerdns/spring-dns-powerdns-context.xml | Defines PowerDNS provider Spring bean. |
| plugins/dns/powerdns/src/main/resources/META-INF/cloudstack/powerdns/module.properties | Declares PowerDNS plugin module metadata. |
| plugins/dns/powerdns/pom.xml | Adds Maven module POM for PowerDNS plugin artifact. |
| engine/schema/src/main/resources/META-INF/db/views/nic_dns_view.sql | Adds DB view to join NICs with DNS mapping and NIC DNS detail. |
| engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql | Extends VM view to include nic_dns_name via nic_details join. |
| engine/schema/src/main/resources/META-INF/db/views/cloud.dns_zone_view.sql | Adds DNS zone query view combining zones, servers, accounts, domains. |
| engine/schema/src/main/resources/META-INF/db/views/cloud.dns_server_view.sql | Adds DNS server query view combining servers, accounts, domains. |
| engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql | Adds DNS server/zone/network mapping tables and details table. |
| engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml | Registers DNS DAOs and join DAOs in schema Spring context. |
| engine/schema/src/main/java/com/cloud/vm/dao/NicDetailsDaoImpl.java | Adds bulk removal method for NIC details by NIC IDs and name. |
| engine/schema/src/main/java/com/cloud/vm/dao/NicDetailsDao.java | Adds DAO API for bulk NIC detail removal. |
| engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java | Adds new VM event topics for lifecycle/action messaging. |
| core/src/main/resources/META-INF/cloudstack/dns/spring-core-lifecycle-dns-context-inheritable.xml | Adds lifecycle registry wiring for DNS providers registry. |
| core/src/main/resources/META-INF/cloudstack/dns/module.properties | Declares core “dns” module metadata. |
| core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml | Adds dnsProvidersRegistry to core registry context. |
| client/pom.xml | Adds PowerDNS plugin artifact as a client dependency. |
| api/src/test/java/org/apache/cloudstack/dns/DnsRecordTest.java | Tests DnsRecord model and RecordType parsing behavior. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/BaseDnsCmdTest.java | Adds shared unit test base for DNS API commands. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/AddDnsServerCmdTest.java | Unit tests for addDnsServer API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmdTest.java | Unit tests for updateDnsServer API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsServerCmdTest.java | Unit tests for deleteDnsServer API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/ListDnsServersCmdTest.java | Unit tests for listDnsServers API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/CreateDnsRecordCmdTest.java | Unit tests for createDnsRecord API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsRecordCmdTest.java | Unit tests for deleteDnsRecord API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/ListDnsRecordsCmdTest.java | Unit tests for listDnsRecords API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/ListDnsProvidersCmdTest.java | Unit tests for listDnsProviders API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmdTest.java | Tests for create/provision DNS zone API command flow (allocation/provision). |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmdTest.java | Unit tests for updateDnsZone API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmdTest.java | Unit tests for deleteDnsZone API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/ListDnsZonesCmdTest.java | Unit tests for listDnsZones API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/AssociateDnsZoneToNetworkCmdTest.java | Unit tests for associate DNS zone to network API command. |
| api/src/test/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmdTest.java | Unit tests for disassociate DNS zone from network API command. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsProviderException.java | Adds base checked exception type for provider failures. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsTransportException.java | Adds provider exception for transport/network IO failures. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsOperationException.java | Adds provider exception for unexpected provider-side operation failures. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsNotFoundException.java | Adds provider exception for missing zone/record conditions. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsConflictException.java | Adds provider exception for zone/record already-exists conditions. |
| api/src/main/java/org/apache/cloudstack/dns/exception/DnsAuthenticationException.java | Adds provider exception for authentication failures. |
| api/src/main/java/org/apache/cloudstack/dns/DnsZone.java | Adds core DNS zone interface contract. |
| api/src/main/java/org/apache/cloudstack/dns/DnsServer.java | Adds core DNS server interface contract. |
| api/src/main/java/org/apache/cloudstack/dns/DnsRecord.java | Adds DNS record model and type parsing helper. |
| api/src/main/java/org/apache/cloudstack/dns/DnsProviderType.java | Adds supported DNS provider type enum (PowerDNS). |
| api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java | Adds DNS provider plugin interface contract. |
| api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java | Adds manager interface for DNS CRUD, plugin operations, and access checks. |
| api/src/main/java/org/apache/cloudstack/api/response/DnsServerResponse.java | Adds API response DTO for DNS server. |
| api/src/main/java/org/apache/cloudstack/api/response/DnsZoneResponse.java | Adds API response DTO for DNS zone. |
| api/src/main/java/org/apache/cloudstack/api/response/DnsRecordResponse.java | Adds API response DTO for DNS record. |
| api/src/main/java/org/apache/cloudstack/api/response/DnsProviderResponse.java | Adds API response DTO for listing DNS providers. |
| api/src/main/java/org/apache/cloudstack/api/response/DnsZoneNetworkMapResponse.java | Adds API response DTO for zone-to-network association. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/AddDnsServerCmd.java | Adds API command to register a DNS server integration. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmd.java | Adds API command to update DNS server integration. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsServerCmd.java | Adds API command to delete DNS server integration. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/ListDnsServersCmd.java | Adds API command to list DNS servers. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmd.java | Adds API command to allocate/provision/import a DNS zone. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmd.java | Adds API command to update DNS zone metadata. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmd.java | Adds API command to delete/unmanage DNS zone. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/ListDnsZonesCmd.java | Adds API command to list DNS zones. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsRecordCmd.java | Adds API command to create DNS records. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsRecordCmd.java | Adds API command to delete DNS records. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/ListDnsRecordsCmd.java | Adds API command to list DNS records. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/ListDnsProvidersCmd.java | Adds API command to list installed DNS provider plugins. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/AssociateDnsZoneToNetworkCmd.java | Adds API command to associate DNS zone to a network. |
| api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java | Adds API command to remove association of a DNS zone from a network. |
| api/src/main/java/org/apache/cloudstack/api/ApiConstants.java | Adds DNS-related API constants used across UI/API/DAOs. |
| api/src/main/java/org/apache/cloudstack/api/BaseCmd.java | Injects DnsProviderManager into API command base class. |
| api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java | Adds nicDnsName to NIC response payload. |
| api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java | Adds dnsZone and dnsSubdomain fields to network response payload. |
| api/src/main/java/com/cloud/vm/Nic.java | Adds NIC lifecycle event topic constant. |
| api/src/main/java/com/cloud/user/ResourceLimitService.java | Adds default DNS zone limit config key for accounts. |
| api/src/main/java/com/cloud/event/EventTypes.java | Adds DNS-related event type constants and entity event mappings. |
Comments suppressed due to low confidence (6)
server/src/main/java/com/cloud/api/ApiDBUtils.java:1
dnsZoneVOcan be null (e.g., mapping exists but zone was deleted/removed or lookup fails), which will NPE atdnsZoneVO.getName(). Add a null check fordnsZoneVObefore dereferencing and return(null, null)(or just the subdomain) accordingly.
ui/src/components/view/ListView.vue:1- This new
v-ifis not mutually exclusive with the otherv-iftemplates below (e.g.,column.key === 'gpu'), so multiple templates can render for the same cell on/dnsserverroutes, causing duplicated content. Convert this tov-else-ifin the existing chain (or otherwise ensure exclusivity) so only one renderer applies per cell.
engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql:1 - The unique constraint name
uc_dns_zone__uuidis already used earlier for thedns_zonetable. In MySQL/InnoDB, constraint names must be unique within the schema, so this migration can fail. Rename this constraint to something table-specific (e.g.,uc_dns_zone_network_map__uuid) to avoid DDL errors.
server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java:1 - The
findByZoneIdmethod parameter is namednetworkId, which is misleading and contradicts both the method name and implementation usage. Rename the parameter todnsZoneIdto avoid confusion and accidental misuse.
ui/src/views/network/dns/DeleteDnsZone.vue:1 - Two issues here: (1)
v-htmlshould be avoided unless strictly necessary because it renders raw HTML (and makes translations harder to reason about safely); prefer plain interpolation and style via components. (2) The confirmation text is hard-coded in English; convert it to an i18n string so it’s localizable like the rest of the UI.
server/src/test/java/org/apache/cloudstack/dns/vo/DnsServerVOTest.java:1 - There is a commented-out assertion left in the test. Either remove it or replace it with a real assertion that matches the current API/behavior to keep tests clean and avoid confusion about intended
getDetail()behavior.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@blueorangutan package |
|
@sudo87 a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress. |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 17706 |



Description
This PR introduces initial implementation for a plugin based DNS framework in Apache CloudStack. It enables both admin and end-users to manage DNS zones and record with external authoritative dns providers.
First supported DNS provider: PowerDNS
Github issue: #9958
Cwiki: https://cwiki.apache.org/confluence/display/CLOUDSTACK/DNS+Framework+and+Plugins
Doc PR: apache/cloudstack-documentation#646
Terminology:
API Changes
There are following APIs have been introduced to support DNS management from CloudStack and Instance auto registration:
UI changes




Supported network for Auto Registration: Shared network
Types of changes
Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale
Bug Severity
Screenshots (if appropriate):
How Has This Been Tested?
How did you try to break this feature and the system with this change?