From 172ac67732b24ec66c03180cdcdb23f39b2c28a1 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Mon, 20 Apr 2026 14:26:07 +0530 Subject: [PATCH] rename dnsrecordurl -> nicdnsname, DnsNicJoinView -> nicDnsJoinVo --- .../apache/cloudstack/api/ApiConstants.java | 2 +- .../cloudstack/api/response/NicResponse.java | 8 +- ...spring-engine-schema-core-daos-context.xml | 2 +- .../META-INF/db/views/cloud.user_vm_view.sql | 4 +- ...loud.dns_nic_view.sql => nic_dns_view.sql} | 10 +- .../api/query/dao/UserVmJoinDaoImpl.java | 4 +- .../com/cloud/api/query/vo/UserVmJoinVO.java | 8 +- .../dns/DnsProviderManagerImpl.java | 88 +++++----- ...{DnsNicJoinDao.java => NicDnsJoinDao.java} | 12 +- ...oinDaoImpl.java => NicDnsJoinDaoImpl.java} | 40 ++--- .../{DnsNicJoinVO.java => NicDnsJoinVO.java} | 14 +- .../dns/DnsProviderManagerImplTest.java | 159 +++++++++--------- .../smoke/test_dns_framework_powerdns.py | 19 ++- ui/public/locales/en.json | 2 +- ui/src/views/network/NicsTable.vue | 4 +- 15 files changed, 194 insertions(+), 182 deletions(-) rename engine/schema/src/main/resources/META-INF/db/views/{cloud.dns_nic_view.sql => nic_dns_view.sql} (89%) rename server/src/main/java/org/apache/cloudstack/dns/dao/{DnsNicJoinDao.java => NicDnsJoinDao.java} (82%) rename server/src/main/java/org/apache/cloudstack/dns/dao/{DnsNicJoinDaoImpl.java => NicDnsJoinDaoImpl.java} (67%) rename server/src/main/java/org/apache/cloudstack/dns/vo/{DnsNicJoinVO.java => NicDnsJoinVO.java} (90%) diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index d9c1eff8ff8..2ca828820fd 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -1372,7 +1372,7 @@ public class ApiConstants { public static final String DISABLED = "disabled"; public static final String CONTENT_TYPE = "Content-Type"; public static final String NATIVE_ZONE = "Native"; - public static final String NIC_DNS_RECORD = "nicdnsrecord"; + public static final String NIC_DNS_NAME = "nicdnsname"; public static final String TIME_STAMP = "timestamp"; public static final String INSTANCE_ID = "instanceId"; public static final String OLD_STATE = "oldState"; diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java index 3f6451d1c66..ad09380e2a4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java @@ -150,9 +150,9 @@ public class NicResponse extends BaseResponse { @Param(description = "whether the NIC is enabled or not") private Boolean isEnabled; - @SerializedName("dnsrecordurl") + @SerializedName(ApiConstants.NIC_DNS_NAME) @Param(description = "Public IP address associated with this NIC via Static NAT rule") - private String dnsRecordUrl; + private String nicDnsName; public void setVmId(String vmId) { this.vmId = vmId; @@ -433,7 +433,7 @@ public class NicResponse extends BaseResponse { isEnabled = enabled; } - public void setDnsRecordUrl(String dnsRecordUrl) { - this.dnsRecordUrl = dnsRecordUrl; + public void setNicDnsName(String nicDnsName) { + this.nicDnsName = nicDnsName; } } diff --git a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml index 61fb30d8657..4720137b568 100644 --- a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml +++ b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml @@ -317,6 +317,6 @@ - + diff --git a/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql b/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql index 969bdad03a8..40ddb250879 100644 --- a/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql +++ b/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql @@ -143,7 +143,7 @@ SELECT `nics`.`broadcast_uri` AS `broadcast_uri`, `nics`.`isolation_uri` AS `isolation_uri`, `nics`.`enabled` AS `is_nic_enabled`, - `nic_details`.`value` AS `dns_record_url`, + `nic_details`.`value` AS `nic_dns_name`, `vpc`.`id` AS `vpc_id`, `vpc`.`uuid` AS `vpc_uuid`, `networks`.`uuid` AS `network_uuid`, @@ -215,7 +215,7 @@ FROM LEFT JOIN `user_data` ON ((`user_data`.`id` = `user_vm`.`user_data_id`))) LEFT JOIN `nics` ON (((`vm_instance`.`id` = `nics`.`instance_id`) AND ISNULL(`nics`.`removed`)))) - LEFT JOIN `nic_details` ON ((`nic_details`.`nic_id` = `nics`.`id`) AND (`nic_details`.`name` = 'nicdnsrecord'))) + LEFT JOIN `nic_details` ON ((`nic_details`.`nic_id` = `nics`.`id`) AND (`nic_details`.`name` = 'nicdnsname'))) LEFT JOIN `networks` ON ((`nics`.`network_id` = `networks`.`id`))) LEFT JOIN `vpc` ON (((`networks`.`vpc_id` = `vpc`.`id`) AND ISNULL(`vpc`.`removed`)))) diff --git a/engine/schema/src/main/resources/META-INF/db/views/cloud.dns_nic_view.sql b/engine/schema/src/main/resources/META-INF/db/views/nic_dns_view.sql similarity index 89% rename from engine/schema/src/main/resources/META-INF/db/views/cloud.dns_nic_view.sql rename to engine/schema/src/main/resources/META-INF/db/views/nic_dns_view.sql index 6506434a319..3ae24098871 100644 --- a/engine/schema/src/main/resources/META-INF/db/views/cloud.dns_nic_view.sql +++ b/engine/schema/src/main/resources/META-INF/db/views/nic_dns_view.sql @@ -15,10 +15,10 @@ -- specific language governing permissions and limitations -- under the License. --- VIEW `cloud`.`dns_nic_view`; +-- VIEW `cloud`.`nic_dns_view`; -DROP VIEW IF EXISTS `cloud`.`dns_nic_view`; -CREATE VIEW `cloud`.`dns_nic_view` AS +DROP VIEW IF EXISTS `cloud`.`nic_dns_view`; +CREATE VIEW `cloud`.`nic_dns_view` AS SELECT n.id AS id, n.uuid AS uuid, @@ -27,7 +27,7 @@ SELECT n.ip4_address AS ip4_address, n.ip6_address AS ip6_address, n.removed AS removed, - nd.value AS nic_dns_url, + nd.value AS nic_dns_name, map.dns_zone_id AS dns_zone_id, map.sub_domain AS sub_domain FROM @@ -35,6 +35,6 @@ FROM INNER JOIN `cloud`.`dns_zone_network_map` map ON n.network_id = map.network_id LEFT JOIN - `cloud`.`nic_details` nd ON n.id = nd.nic_id AND nd.name = 'nicdnsrecord' + `cloud`.`nic_details` nd ON n.id = nd.nic_id AND nd.name = 'nicdnsname' WHERE map.removed IS NULL; diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 94cd8f03fc9..e544e68ddb1 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -360,7 +360,7 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation dnsRecordNames = records.stream().map(DnsRecord::getName).filter(Objects::nonNull) .map(name -> name.replaceAll("\\.+$", "")) .collect(Collectors.toList()); - nicDetailsDao.removeDetailsForValuesIn(ApiConstants.NIC_DNS_RECORD, dnsRecordNames); + nicDetailsDao.removeDetailsForValuesIn(ApiConstants.NIC_DNS_NAME, dnsRecordNames); } } catch (Exception ex) { logger.warn("Failed to fetch DNS records for dnsZone: {}, perform manual cleanup.", dnsZoneName, ex); @@ -882,13 +882,13 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa logger.debug("Instance is not found for the given ID: {}", instanceId); return; } - List mappedNics = dnsNicJoinDao.listActiveByVmId(instanceId); + List mappedNics = nicDnsJoinDao.listActiveByVmId(instanceId); if (CollectionUtils.isEmpty(mappedNics)) { logger.debug("No active DNS zone associated to NICs"); return; } - Map>> dnsZoneRecordNicMap = new HashMap<>(); - for (DnsNicJoinVO nic : mappedNics) { + Map>> dnsZoneRecordNicMap = new HashMap<>(); + for (NicDnsJoinVO nic : mappedNics) { DnsZoneVO targetZone = dnsZoneDao.findById(nic.getDnsZoneId()); if (targetZone == null) { continue; @@ -899,11 +899,11 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa .add(nic); } - for (Map.Entry>> zoneEntry : dnsZoneRecordNicMap.entrySet()) { + for (Map.Entry>> zoneEntry : dnsZoneRecordNicMap.entrySet()) { long targetZoneId = zoneEntry.getKey(); - for (Map.Entry> dnsUrlEntry : zoneEntry.getValue().entrySet()) { + for (Map.Entry> dnsUrlEntry : zoneEntry.getValue().entrySet()) { String dnsRecordUrl = dnsUrlEntry.getKey(); - List nicsForThisFqdn = dnsUrlEntry.getValue(); + List nicsForThisFqdn = dnsUrlEntry.getValue(); try { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override @@ -911,8 +911,8 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa if (isDnsCollision(dnsRecordUrl, targetZoneId, instanceId)) { return; } - for (DnsNicJoinVO nic : nicsForThisFqdn) { - nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD, dnsRecordUrl, true); + for (NicDnsJoinVO nic : nicsForThisFqdn) { + nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_NAME, dnsRecordUrl, true); } syncDnsRecordsState(instanceId, dnsRecordUrl, targetZoneId); } @@ -927,34 +927,34 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa } void handleVmStopAndDestroy(long instanceId) { - List historicalNics = dnsNicJoinDao.listIncludingRemovedByVmId(instanceId); + List historicalNics = nicDnsJoinDao.listIncludingRemovedByVmId(instanceId); if (CollectionUtils.isEmpty(historicalNics)) { return; } - Map>> groupByDnsZone = new HashMap<>(); - for (DnsNicJoinVO nic : historicalNics) { + Map>> groupByDnsZone = new HashMap<>(); + for (NicDnsJoinVO nic : historicalNics) { // If the DNS record url is null, it means this NIC was never registered in nic_details - if (nic.getNicDnsUrl() == null) { + if (nic.getNicDnsName() == null) { continue; } groupByDnsZone .computeIfAbsent(nic.getDnsZoneId(), k -> new HashMap<>()) - .computeIfAbsent(nic.getNicDnsUrl(), k -> new ArrayList<>()) + .computeIfAbsent(nic.getNicDnsName(), k -> new ArrayList<>()) .add(nic); } - for (Map.Entry>> zoneEntry : groupByDnsZone.entrySet()) { + for (Map.Entry>> zoneEntry : groupByDnsZone.entrySet()) { long targetZoneId = zoneEntry.getKey(); - for (Map.Entry> dnsRecordEntry : zoneEntry.getValue().entrySet()) { + for (Map.Entry> dnsRecordEntry : zoneEntry.getValue().entrySet()) { String dnsRecordUrl = dnsRecordEntry.getKey(); - List nicsForDnsUrl = dnsRecordEntry.getValue(); + List nicsForDnsUrl = dnsRecordEntry.getValue(); try { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override public void doInTransactionWithoutResult(TransactionStatus status) throws DnsProviderException { - for (DnsNicJoinVO nic : nicsForDnsUrl) { - nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD); + for (NicDnsJoinVO nic : nicsForDnsUrl) { + nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_NAME); } // Because we just deleted the nic_details, the sync method will naturally // find 0 active IPs for this VM/FQDN combo and issue a clean DELETE to PowerDNS. @@ -978,19 +978,19 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa return; } - List mappedNics = dnsNicJoinDao.listActiveByVmId(instanceId); + List mappedNics = nicDnsJoinDao.listActiveByVmId(instanceId); if (CollectionUtils.isEmpty(mappedNics)) { return; } - Map>> dnsZoneNewRecordNicMap = new HashMap<>(); - for (DnsNicJoinVO nic : mappedNics) { + Map>> dnsZoneNewRecordNicMap = new HashMap<>(); + for (NicDnsJoinVO nic : mappedNics) { DnsZoneVO targetZone = dnsZoneDao.findById(nic.getDnsZoneId()); if (targetZone == null) { continue; } - String oldDnsRecordUrl = nic.getNicDnsUrl(); + String oldDnsRecordUrl = nic.getNicDnsName(); String newDnsRecordUrl = prepareDnsRecordUrl(newHostName, nic.getSubDomain(), targetZone.getName()); if (newDnsRecordUrl.equals(oldDnsRecordUrl)) { continue; @@ -1001,22 +1001,22 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa .add(nic); } - for (Map.Entry>> zoneEntry : dnsZoneNewRecordNicMap.entrySet()) { + for (Map.Entry>> zoneEntry : dnsZoneNewRecordNicMap.entrySet()) { long targetZoneId = zoneEntry.getKey(); - for (Map.Entry> newUrlEntry : zoneEntry.getValue().entrySet()) { + for (Map.Entry> newUrlEntry : zoneEntry.getValue().entrySet()) { String newDnsRecordUrl = newUrlEntry.getKey(); - List nicsForThisFqdn = newUrlEntry.getValue(); + List nicsForThisFqdn = newUrlEntry.getValue(); try { Set oldDnsRecordUrls = new HashSet<>(); Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override public void doInTransactionWithoutResult(TransactionStatus status) throws DnsProviderException { - for (DnsNicJoinVO nic : nicsForThisFqdn) { - if (nic.getNicDnsUrl() != null) { - oldDnsRecordUrls.add(nic.getNicDnsUrl()); - nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD); + for (NicDnsJoinVO nic : nicsForThisFqdn) { + if (nic.getNicDnsName() != null) { + oldDnsRecordUrls.add(nic.getNicDnsName()); + nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_NAME); } } for (String oldUrl : oldDnsRecordUrls) { @@ -1031,8 +1031,8 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa if (isDnsCollision(newDnsRecordUrl, targetZoneId, instanceId)) { return; } - for (DnsNicJoinVO nic : nicsForThisFqdn) { - nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD, newDnsRecordUrl, true); + for (NicDnsJoinVO nic : nicsForThisFqdn) { + nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_NAME, newDnsRecordUrl, true); } // This sync call finds the newly written intent and sends an ADD/REPLACE call. syncDnsRecordsState(instanceId, newDnsRecordUrl, targetZoneId); @@ -1053,7 +1053,7 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa if (instance == null || instance.getState() != VirtualMachine.State.Running) { return; } - DnsNicJoinVO nic = dnsNicJoinDao.findById(nicId); + NicDnsJoinVO nic = nicDnsJoinDao.findById(nicId); if (nic == null) { logger.debug("NIC with ID: {} doesn't have DNS zone associated", nicId); return; @@ -1073,7 +1073,7 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa if (isDnsCollision(dnsRecordUrl, targetZone.getId(), instanceId)) { return; } - nicDetailsDao.addDetail(nicId, ApiConstants.NIC_DNS_RECORD, dnsRecordUrl, true); + nicDetailsDao.addDetail(nicId, ApiConstants.NIC_DNS_NAME, dnsRecordUrl, true); syncDnsRecordsState(instanceId, dnsRecordUrl, targetZone.getId()); logger.debug("Successfully synced DNS on NIC Plug for: {}", dnsRecordUrl); } @@ -1086,18 +1086,18 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa } void handleNicUnplug(long instanceId, long nicId) { - DnsNicJoinVO nic = dnsNicJoinDao.findByIdIncludingRemoved(nicId); - if (nic == null || nic.getNicDnsUrl() == null) { + NicDnsJoinVO nic = nicDnsJoinDao.findByIdIncludingRemoved(nicId); + if (nic == null || nic.getNicDnsName() == null) { return; } - String dnsRecordUrl = nic.getNicDnsUrl(); + String dnsRecordUrl = nic.getNicDnsName(); long dnsZoneId = nic.getDnsZoneId(); try { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override public void doInTransactionWithoutResult(TransactionStatus status) throws DnsProviderException { - nicDetailsDao.removeDetail(nicId, ApiConstants.NIC_DNS_RECORD); + nicDetailsDao.removeDetail(nicId, ApiConstants.NIC_DNS_NAME); syncDnsRecordsState(instanceId, dnsRecordUrl, dnsZoneId); logger.debug("Successfully synced DNS record: {} on NIC unplug", dnsRecordUrl); } @@ -1120,7 +1120,7 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa } private boolean isDnsCollision(String dnsRecordUrl, long targetZoneId, long instanceId) { - DnsNicJoinVO existing = dnsNicJoinDao.findActiveByDnsRecordAndZone(dnsRecordUrl, targetZoneId); + NicDnsJoinVO existing = nicDnsJoinDao.findActiveByDnsRecordAndZone(dnsRecordUrl, targetZoneId); if (existing != null && existing.getInstanceId() != instanceId) { logger.error("DNS collision: cannot register DNS record: {}. Already owned by Instance: {}.", dnsRecordUrl, existing.getInstanceId()); @@ -1141,11 +1141,11 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa return; } DnsServerVO dnsServer = dnsServerDao.findById(dnsZone.getDnsServerId()); - List activeNics = dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(instanceId, dnsZoneId, dnsRecordUrl); + List activeNics = nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(instanceId, dnsZoneId, dnsRecordUrl); List ipv4s = new ArrayList<>(); List ipv6s = new ArrayList<>(); - for (DnsNicJoinVO nic : activeNics) { + for (NicDnsJoinVO nic : activeNics) { if (nic.getIp4Address() != null && !nic.getIp4Address().isEmpty()) { ipv4s.add(nic.getIp4Address()); } diff --git a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDao.java b/server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDao.java similarity index 82% rename from server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDao.java rename to server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDao.java index fc91d34df44..71b1487fba6 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDao.java +++ b/server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDao.java @@ -19,11 +19,11 @@ package org.apache.cloudstack.dns.dao; import java.util.List; -import org.apache.cloudstack.dns.vo.DnsNicJoinVO; +import org.apache.cloudstack.dns.vo.NicDnsJoinVO; import com.cloud.utils.db.GenericDao; -public interface DnsNicJoinDao extends GenericDao { +public interface NicDnsJoinDao extends GenericDao { /** * Used for Collision Checks. @@ -31,7 +31,7 @@ public interface DnsNicJoinDao extends GenericDao { * @param dnsZoneId * @return active records to see who currently owns the dnsRecordUrl. */ - DnsNicJoinVO findActiveByDnsRecordAndZone(String dnsRecordUrl, long dnsZoneId); + NicDnsJoinVO findActiveByDnsRecordAndZone(String dnsRecordUrl, long dnsZoneId); /** * Used to sync DNS record url based on available ips for vmId in the dnsZone @@ -40,19 +40,19 @@ public interface DnsNicJoinDao extends GenericDao { * @param dnsRecordUrl * @return list of active nics using the dnsRecordUrl, supports null vmId for dnsZone wide query */ - List listActiveByVmIdZoneAndDnsRecord(Long vmId, long dnsZoneId, String dnsRecordUrl); + List listActiveByVmIdZoneAndDnsRecord(Long vmId, long dnsZoneId, String dnsRecordUrl); /** * Used for VM Start/Running * @param vmId * @return records associated to vmId */ - List listActiveByVmId(long vmId); + List listActiveByVmId(long vmId); /** * Used by Instance Destroy/Stop or NIC delete * @param vmId * @return records with soft-delete */ - List listIncludingRemovedByVmId(long vmId); + List listIncludingRemovedByVmId(long vmId); } diff --git a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDaoImpl.java b/server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDaoImpl.java similarity index 67% rename from server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDaoImpl.java rename to server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDaoImpl.java index 9fd718f67fe..60bffd25fc4 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsNicJoinDaoImpl.java +++ b/server/src/main/java/org/apache/cloudstack/dns/dao/NicDnsJoinDaoImpl.java @@ -20,28 +20,28 @@ package org.apache.cloudstack.dns.dao; import java.util.List; import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.dns.vo.DnsNicJoinVO; +import org.apache.cloudstack.dns.vo.NicDnsJoinVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -public class DnsNicJoinDaoImpl extends GenericDaoBase implements DnsNicJoinDao { - private final SearchBuilder activeDnsRecordZoneSearch; - private final SearchBuilder activeVmZoneDnsRecordSearch; // Route for null vmId - private final SearchBuilder activeVmSearch; +public class NicDnsJoinDaoImpl extends GenericDaoBase implements NicDnsJoinDao { + private final SearchBuilder activeDnsRecordZoneSearch; + private final SearchBuilder activeVmZoneDnsRecordSearch; // Route for null vmId + private final SearchBuilder activeVmSearch; - public DnsNicJoinDaoImpl() { + public NicDnsJoinDaoImpl() { activeDnsRecordZoneSearch = createSearchBuilder(); - activeDnsRecordZoneSearch.and(ApiConstants.NIC_DNS_RECORD, activeDnsRecordZoneSearch.entity().getNicDnsUrl(), SearchCriteria.Op.EQ); + activeDnsRecordZoneSearch.and(ApiConstants.NIC_DNS_NAME, activeDnsRecordZoneSearch.entity().getNicDnsName(), SearchCriteria.Op.EQ); activeDnsRecordZoneSearch.and(ApiConstants.DNS_ZONE_ID, activeDnsRecordZoneSearch.entity().getDnsZoneId(), SearchCriteria.Op.EQ); activeDnsRecordZoneSearch.and(ApiConstants.REMOVED, activeDnsRecordZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); activeDnsRecordZoneSearch.done(); activeVmZoneDnsRecordSearch = createSearchBuilder(); activeVmZoneDnsRecordSearch.and(ApiConstants.INSTANCE_ID, activeVmZoneDnsRecordSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); - activeVmZoneDnsRecordSearch.and(ApiConstants.NIC_DNS_RECORD, activeVmZoneDnsRecordSearch.entity().getNicDnsUrl(), SearchCriteria.Op.EQ); + activeVmZoneDnsRecordSearch.and(ApiConstants.NIC_DNS_NAME, activeVmZoneDnsRecordSearch.entity().getNicDnsName(), SearchCriteria.Op.EQ); activeVmZoneDnsRecordSearch.and(ApiConstants.DNS_ZONE_ID, activeVmZoneDnsRecordSearch.entity().getDnsZoneId(), SearchCriteria.Op.EQ); activeVmZoneDnsRecordSearch.and(ApiConstants.REMOVED, activeVmZoneDnsRecordSearch.entity().getRemoved(), SearchCriteria.Op.NULL); activeVmZoneDnsRecordSearch.done(); @@ -52,39 +52,39 @@ public class DnsNicJoinDaoImpl extends GenericDaoBase implem } @Override - public DnsNicJoinVO findActiveByDnsRecordAndZone(String dnsRecordUrl, long dnsZoneId) { - SearchCriteria sc = activeDnsRecordZoneSearch.create(); - sc.setParameters(ApiConstants.NIC_DNS_RECORD, dnsRecordUrl); + public NicDnsJoinVO findActiveByDnsRecordAndZone(String dnsRecordUrl, long dnsZoneId) { + SearchCriteria sc = activeDnsRecordZoneSearch.create(); + sc.setParameters(ApiConstants.NIC_DNS_NAME, dnsRecordUrl); sc.setParameters(ApiConstants.DNS_ZONE_ID, dnsZoneId); return findOneBy(sc); } @Override - public List listActiveByVmIdZoneAndDnsRecord(Long vmId, long dnsZoneId, String dnsRecordUrl) { + public List listActiveByVmIdZoneAndDnsRecord(Long vmId, long dnsZoneId, String dnsRecordUrl) { if (vmId != null) { - SearchCriteria sc = activeDnsRecordZoneSearch.create(); + SearchCriteria sc = activeDnsRecordZoneSearch.create(); sc.setParameters(ApiConstants.INSTANCE_ID, vmId); sc.setParameters(ApiConstants.DNS_ZONE_ID, dnsZoneId); - sc.setParameters(ApiConstants.NIC_DNS_RECORD, dnsRecordUrl); + sc.setParameters(ApiConstants.NIC_DNS_NAME, dnsRecordUrl); return listBy(sc); } else { - SearchCriteria sc = activeDnsRecordZoneSearch.create(); - sc.setParameters(ApiConstants.NIC_DNS_RECORD, dnsRecordUrl); + SearchCriteria sc = activeDnsRecordZoneSearch.create(); + sc.setParameters(ApiConstants.NIC_DNS_NAME, dnsRecordUrl); sc.setParameters(ApiConstants.DNS_ZONE_ID, dnsZoneId); return listBy(sc); } } @Override - public List listActiveByVmId(long vmId) { - SearchCriteria sc = activeVmSearch.create(); + public List listActiveByVmId(long vmId) { + SearchCriteria sc = activeVmSearch.create(); sc.setParameters(ApiConstants.INSTANCE_ID, vmId); return listBy(sc); } @Override - public List listIncludingRemovedByVmId(long vmId) { - SearchCriteria sc = activeVmSearch.create(); + public List listIncludingRemovedByVmId(long vmId) { + SearchCriteria sc = activeVmSearch.create(); sc.setParameters(ApiConstants.INSTANCE_ID, vmId); return listIncludingRemovedBy(sc); } diff --git a/server/src/main/java/org/apache/cloudstack/dns/vo/DnsNicJoinVO.java b/server/src/main/java/org/apache/cloudstack/dns/vo/NicDnsJoinVO.java similarity index 90% rename from server/src/main/java/org/apache/cloudstack/dns/vo/DnsNicJoinVO.java rename to server/src/main/java/org/apache/cloudstack/dns/vo/NicDnsJoinVO.java index 7396c86949f..893e53188f2 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/vo/DnsNicJoinVO.java +++ b/server/src/main/java/org/apache/cloudstack/dns/vo/NicDnsJoinVO.java @@ -34,8 +34,8 @@ import org.apache.cloudstack.api.InternalIdentity; import com.cloud.api.query.vo.BaseViewVO; @Entity -@Table(name = "dns_nic_view") -public class DnsNicJoinVO extends BaseViewVO implements InternalIdentity, Identity { +@Table(name = "nic_dns_view") +public class NicDnsJoinVO extends BaseViewVO implements InternalIdentity, Identity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") @@ -56,8 +56,8 @@ public class DnsNicJoinVO extends BaseViewVO implements InternalIdentity, Identi @Column(name = "ip6_address") private String ip6Address; - @Column(name = "nic_dns_url") - private String nicDnsUrl; + @Column(name = "nic_dns_name") + private String nicDnsName; @Column(name = "dns_zone_id") private long dnsZoneId; @@ -68,7 +68,7 @@ public class DnsNicJoinVO extends BaseViewVO implements InternalIdentity, Identi @Column(name = "removed") private Date removed; - public DnsNicJoinVO() { + public NicDnsJoinVO() { } @Override @@ -97,8 +97,8 @@ public class DnsNicJoinVO extends BaseViewVO implements InternalIdentity, Identi return subDomain; } - public String getNicDnsUrl() { - return nicDnsUrl; + public String getNicDnsName() { + return nicDnsName; } public String getIp4Address() { diff --git a/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java index 26a1a1b7ac3..522eba2caf0 100644 --- a/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/dns/DnsProviderManagerImplTest.java @@ -52,7 +52,7 @@ import org.apache.cloudstack.api.response.DnsZoneNetworkMapResponse; import org.apache.cloudstack.api.response.DnsZoneResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.dns.dao.DnsNicJoinDao; +import org.apache.cloudstack.dns.dao.NicDnsJoinDao; import org.apache.cloudstack.dns.dao.DnsServerDao; import org.apache.cloudstack.dns.dao.DnsServerJoinDao; import org.apache.cloudstack.dns.dao.DnsZoneDao; @@ -67,6 +67,7 @@ import org.apache.cloudstack.dns.vo.DnsServerVO; import org.apache.cloudstack.dns.vo.DnsZoneJoinVO; import org.apache.cloudstack.dns.vo.DnsZoneNetworkMapVO; import org.apache.cloudstack.dns.vo.DnsZoneVO; +import org.apache.cloudstack.dns.vo.NicDnsJoinVO; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.junit.After; import org.junit.Before; @@ -127,7 +128,7 @@ public class DnsProviderManagerImplTest { @Mock NicDetailsDao nicDetailsDao; @Mock - DnsNicJoinDao dnsNicJoinDao; + NicDnsJoinDao nicDnsJoinDao; @Mock MessageBus messageBus; @Mock @@ -896,9 +897,9 @@ public class DnsProviderManagerImplTest { event.put(org.apache.cloudstack.api.ApiConstants.OLD_STATE, com.cloud.vm.VirtualMachine.State.Running); event.put(org.apache.cloudstack.api.ApiConstants.NEW_STATE, com.cloud.vm.VirtualMachine.State.Stopped); event.put(org.apache.cloudstack.api.ApiConstants.INSTANCE_ID, 15L); - when(dnsNicJoinDao.listIncludingRemovedByVmId(15L)).thenReturn(null); + when(nicDnsJoinDao.listIncludingRemovedByVmId(15L)).thenReturn(null); subscriber.onPublishMessage("sender", "subject", event); - verify(dnsNicJoinDao, times(1)).listIncludingRemovedByVmId(15L); + verify(nicDnsJoinDao, times(1)).listIncludingRemovedByVmId(15L); } @Test @@ -943,9 +944,9 @@ public class DnsProviderManagerImplTest { event.put(org.apache.cloudstack.api.ApiConstants.EVENT_TYPE, com.cloud.event.EventTypes.EVENT_NIC_DELETE); event.put(org.apache.cloudstack.api.ApiConstants.NIC_ID, 101L); event.put(org.apache.cloudstack.api.ApiConstants.INSTANCE_ID, 201L); - when(dnsNicJoinDao.findByIdIncludingRemoved(101L)).thenReturn(null); + when(nicDnsJoinDao.findByIdIncludingRemoved(101L)).thenReturn(null); subscriber.onPublishMessage("sender", "subject", event); - verify(dnsNicJoinDao, times(1)).findByIdIncludingRemoved(101L); + verify(nicDnsJoinDao, times(1)).findByIdIncludingRemoved(101L); } @Test @@ -1035,7 +1036,7 @@ public class DnsProviderManagerImplTest { public void testSyncDnsRecordsStateNoIpv4AndNoIpv6DeletesBothRecords() throws Exception { when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(anyLong(), anyLong(), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(anyLong(), anyLong(), anyString())) .thenReturn(Collections.emptyList()); manager.syncDnsRecordsState(1L, "myvm.example.com", ZONE_ID); @@ -1049,10 +1050,10 @@ public class DnsProviderManagerImplTest { when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nic = mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nic = mock(NicDnsJoinVO.class); when(nic.getIp4Address()).thenReturn("10.0.0.1"); when(nic.getIp6Address()).thenReturn(null); - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(anyLong(), anyLong(), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(anyLong(), anyLong(), anyString())) .thenReturn(Collections.singletonList(nic)); manager.syncDnsRecordsState(1L, "myvm.example.com", ZONE_ID); @@ -1067,7 +1068,7 @@ public class DnsProviderManagerImplTest { public void testHandleVmRunningStateFoundButNoActiveNics() throws DnsProviderException { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(30L)).thenReturn(instanceMock); - when(dnsNicJoinDao.listActiveByVmId(30L)).thenReturn(Collections.emptyList()); + when(nicDnsJoinDao.listActiveByVmId(30L)).thenReturn(Collections.emptyList()); manager.handleVmRunningState(30L); @@ -1077,10 +1078,10 @@ public class DnsProviderManagerImplTest { @Test public void testHandleVmStopAndDestroyNicWithNullDnsUrlIsSkipped() throws DnsProviderException { - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); - when(nicMock.getNicDnsUrl()).thenReturn(null); - when(dnsNicJoinDao.listIncludingRemovedByVmId(31L)) + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); + when(nicMock.getNicDnsName()).thenReturn(null); + when(nicDnsJoinDao.listIncludingRemovedByVmId(31L)) .thenReturn(Collections.singletonList(nicMock)); manager.handleVmStopAndDestroy(31L); @@ -1090,16 +1091,16 @@ public class DnsProviderManagerImplTest { @Test public void testHandleVmStopAndDestroyWithValidDnsUrlTriggersCleanup() throws Exception { - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); - when(nicMock.getNicDnsUrl()).thenReturn("myvm.example.com"); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); + when(nicMock.getNicDnsName()).thenReturn("myvm.example.com"); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); - when(dnsNicJoinDao.listIncludingRemovedByVmId(32L)) + when(nicDnsJoinDao.listIncludingRemovedByVmId(32L)) .thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(32L), eq(ZONE_ID), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(32L), eq(ZONE_ID), anyString())) .thenReturn(Collections.emptyList()); try (MockedStatic txMock = @@ -1119,7 +1120,7 @@ public class DnsProviderManagerImplTest { manager.handleVmStopAndDestroy(32L); - verify(nicDetailsDao).removeDetail(nicMock.getId(), org.apache.cloudstack.api.ApiConstants.NIC_DNS_RECORD); + verify(nicDetailsDao).removeDetail(nicMock.getId(), org.apache.cloudstack.api.ApiConstants.NIC_DNS_NAME); verify(dnsProviderMock, times(2)).deleteRecord(eq(serverVO), eq(zoneVO), any(DnsRecord.class)); } } @@ -1132,21 +1133,21 @@ public class DnsProviderManagerImplTest { manager.handleNicPlug(33L, 500L); - verify(dnsNicJoinDao, never()).findById(anyLong()); + verify(nicDnsJoinDao, never()).findById(anyLong()); verify(dnsProviderMock, never()).addRecord(any(), any(), any()); } @Test public void testHandleNicUnplugNicHasValidDnsUrlTriggersSyncCleanup() throws Exception { - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); - when(nicMock.getNicDnsUrl()).thenReturn("myvm.example.com"); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); + when(nicMock.getNicDnsName()).thenReturn("myvm.example.com"); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); - when(dnsNicJoinDao.findByIdIncludingRemoved(600L)).thenReturn(nicMock); + when(nicDnsJoinDao.findByIdIncludingRemoved(600L)).thenReturn(nicMock); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(34L), eq(ZONE_ID), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(34L), eq(ZONE_ID), anyString())) .thenReturn(Collections.emptyList()); try (MockedStatic txMock = @@ -1166,7 +1167,7 @@ public class DnsProviderManagerImplTest { manager.handleNicUnplug(34L, 600L); - verify(nicDetailsDao).removeDetail(600L, org.apache.cloudstack.api.ApiConstants.NIC_DNS_RECORD); + verify(nicDetailsDao).removeDetail(600L, org.apache.cloudstack.api.ApiConstants.NIC_DNS_NAME); verify(dnsProviderMock, times(2)).deleteRecord(eq(serverVO), eq(zoneVO), any(DnsRecord.class)); } } @@ -1175,7 +1176,7 @@ public class DnsProviderManagerImplTest { public void testHandleVmHostnameChangedVmFoundButNoActiveNicsExitsEarly() throws DnsProviderException { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(35L)).thenReturn(instanceMock); - when(dnsNicJoinDao.listActiveByVmId(35L)).thenReturn(Collections.emptyList()); + when(nicDnsJoinDao.listActiveByVmId(35L)).thenReturn(Collections.emptyList()); manager.handleVmHostnameChanged(35L, "newname"); @@ -1185,10 +1186,10 @@ public class DnsProviderManagerImplTest { @Test public void testIsDnsCollisionReturnsTrueForDifferentInstance() { - org.apache.cloudstack.dns.vo.DnsNicJoinVO existing = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO existing = + mock(NicDnsJoinVO.class); when(existing.getInstanceId()).thenReturn(99L); - when(dnsNicJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(existing); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(existing); try (MockedStatic aeMock = Mockito.mockStatic(com.cloud.event.ActionEventUtils.class)) { @@ -1203,7 +1204,7 @@ public class DnsProviderManagerImplTest { @Test public void testIsDnsCollisionReturnsFalseWhenNoExistingRecord() { - when(dnsNicJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(null); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(null); boolean result = (boolean) ReflectionTestUtils.invokeMethod( manager, "isDnsCollision", "vm.example.com", ZONE_ID, 42L); assertFalse(result); @@ -1211,10 +1212,10 @@ public class DnsProviderManagerImplTest { @Test public void testIsDnsCollisionReturnsFalseWhenSameInstance() { - org.apache.cloudstack.dns.vo.DnsNicJoinVO existing = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO existing = + mock(NicDnsJoinVO.class); when(existing.getInstanceId()).thenReturn(42L); - when(dnsNicJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(existing); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone("vm.example.com", ZONE_ID)).thenReturn(existing); boolean result = (boolean) ReflectionTestUtils.invokeMethod( manager, "isDnsCollision", "vm.example.com", ZONE_ID, 42L); assertFalse(result); @@ -1226,15 +1227,15 @@ public class DnsProviderManagerImplTest { when(instanceMock.getState()).thenReturn(com.cloud.vm.VirtualMachine.State.Running); when(vmInstanceDao.findById(40L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); - when(dnsNicJoinDao.findById(700L)).thenReturn(nicMock); + when(nicDnsJoinDao.findById(700L)).thenReturn(nicMock); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(null); // zone missing → exit after NIC lookup manager.handleNicPlug(40L, 700L); - verify(dnsNicJoinDao, times(1)).findById(700L); + verify(nicDnsJoinDao, times(1)).findById(700L); verify(dnsProviderMock, never()).addRecord(any(), any(), any()); } @@ -1244,10 +1245,10 @@ public class DnsProviderManagerImplTest { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(41L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); - when(dnsNicJoinDao.listActiveByVmId(41L)).thenReturn(Collections.singletonList(nicMock)); + when(nicDnsJoinDao.listActiveByVmId(41L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(null); // zone null → NIC skipped → empty map manager.handleVmHostnameChanged(41L, "newname"); @@ -1261,10 +1262,10 @@ public class DnsProviderManagerImplTest { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(42L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); - when(dnsNicJoinDao.listActiveByVmId(42L)).thenReturn(Collections.singletonList(nicMock)); + when(nicDnsJoinDao.listActiveByVmId(42L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(null); // zone null → NIC skipped → empty outer map manager.handleVmRunningState(42L); @@ -1301,7 +1302,7 @@ public class DnsProviderManagerImplTest { public void testHandleVmRunningStateInstanceNullExitsEarly() throws DnsProviderException { when(vmInstanceDao.findById(50L)).thenReturn(null); manager.handleVmRunningState(50L); - verify(dnsNicJoinDao, never()).listActiveByVmId(anyLong()); + verify(nicDnsJoinDao, never()).listActiveByVmId(anyLong()); } @Test @@ -1310,18 +1311,18 @@ public class DnsProviderManagerImplTest { when(instanceMock.getHostName()).thenReturn("myvm"); when(vmInstanceDao.findById(51L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); when(nicMock.getSubDomain()).thenReturn(null); - when(dnsNicJoinDao.listActiveByVmId(51L)).thenReturn(Collections.singletonList(nicMock)); + when(nicDnsJoinDao.listActiveByVmId(51L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); // no collision - when(dnsNicJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(null); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(null); // sync: no IPs → delete both - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(51L), eq(ZONE_ID), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(51L), eq(ZONE_ID), anyString())) .thenReturn(Collections.emptyList()); try (MockedStatic txMock = @@ -1339,7 +1340,7 @@ public class DnsProviderManagerImplTest { manager.handleVmRunningState(51L); verify(nicDetailsDao).addDetail(anyLong(), - eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_RECORD), anyString(), eq(true)); + eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_NAME), anyString(), eq(true)); verify(dnsProviderMock, times(2)).deleteRecord(eq(serverVO), eq(zoneVO), any(DnsRecord.class)); } } @@ -1350,18 +1351,18 @@ public class DnsProviderManagerImplTest { when(instanceMock.getHostName()).thenReturn("myvm"); when(vmInstanceDao.findById(52L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); when(nicMock.getSubDomain()).thenReturn(null); - when(dnsNicJoinDao.listActiveByVmId(52L)).thenReturn(Collections.singletonList(nicMock)); + when(nicDnsJoinDao.listActiveByVmId(52L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); // collision: different instance owns the record - org.apache.cloudstack.dns.vo.DnsNicJoinVO colliding = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO colliding = + mock(NicDnsJoinVO.class); when(colliding.getInstanceId()).thenReturn(999L); - when(dnsNicJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(colliding); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(colliding); try (MockedStatic txMock = Mockito.mockStatic(com.cloud.utils.db.Transaction.class); @@ -1393,7 +1394,7 @@ public class DnsProviderManagerImplTest { public void testHandleVmHostnameChangedInstanceNullExitsEarly() throws DnsProviderException { when(vmInstanceDao.findById(60L)).thenReturn(null); manager.handleVmHostnameChanged(60L, "newname"); - verify(dnsNicJoinDao, never()).listActiveByVmId(anyLong()); + verify(nicDnsJoinDao, never()).listActiveByVmId(anyLong()); } @Test @@ -1401,13 +1402,13 @@ public class DnsProviderManagerImplTest { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(61L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); when(nicMock.getSubDomain()).thenReturn(null); // old URL already equals the new computed URL → continue (skip) - when(nicMock.getNicDnsUrl()).thenReturn("newname.example.com"); - when(dnsNicJoinDao.listActiveByVmId(61L)).thenReturn(Collections.singletonList(nicMock)); + when(nicMock.getNicDnsName()).thenReturn("newname.example.com"); + when(nicDnsJoinDao.listActiveByVmId(61L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); manager.handleVmHostnameChanged(61L, "newname"); @@ -1422,19 +1423,19 @@ public class DnsProviderManagerImplTest { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(62L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); when(nicMock.getSubDomain()).thenReturn(null); - when(nicMock.getNicDnsUrl()).thenReturn("oldvm.example.com"); // differs from new FQDN - when(dnsNicJoinDao.listActiveByVmId(62L)).thenReturn(Collections.singletonList(nicMock)); + when(nicMock.getNicDnsName()).thenReturn("oldvm.example.com"); // differs from new FQDN + when(nicDnsJoinDao.listActiveByVmId(62L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); // no collision for new record - when(dnsNicJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(null); + when(nicDnsJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(null); // sync always returns empty → deleteRecord called - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(62L), eq(ZONE_ID), anyString())) + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(62L), eq(ZONE_ID), anyString())) .thenReturn(Collections.emptyList()); try (MockedStatic txMock = @@ -1453,10 +1454,10 @@ public class DnsProviderManagerImplTest { // Tx1: old URL removed from nic_details verify(nicDetailsDao).removeDetail(anyLong(), - eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_RECORD)); + eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_NAME)); // Tx2: new URL written to nic_details verify(nicDetailsDao).addDetail(anyLong(), - eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_RECORD), anyString(), eq(true)); + eq(org.apache.cloudstack.api.ApiConstants.NIC_DNS_NAME), anyString(), eq(true)); // deleteRecord called for both old-sync (A+AAAA) and new-sync (A+AAAA) = 4 total verify(dnsProviderMock, times(4)).deleteRecord(eq(serverVO), eq(zoneVO), any(DnsRecord.class)); } @@ -1467,21 +1468,21 @@ public class DnsProviderManagerImplTest { com.cloud.vm.VMInstanceVO instanceMock = mock(com.cloud.vm.VMInstanceVO.class); when(vmInstanceDao.findById(63L)).thenReturn(instanceMock); - org.apache.cloudstack.dns.vo.DnsNicJoinVO nicMock = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO nicMock = + mock(NicDnsJoinVO.class); when(nicMock.getDnsZoneId()).thenReturn(ZONE_ID); when(nicMock.getSubDomain()).thenReturn(null); - when(nicMock.getNicDnsUrl()).thenReturn("oldvm.example.com"); - when(dnsNicJoinDao.listActiveByVmId(63L)).thenReturn(Collections.singletonList(nicMock)); + when(nicMock.getNicDnsName()).thenReturn("oldvm.example.com"); + when(nicDnsJoinDao.listActiveByVmId(63L)).thenReturn(Collections.singletonList(nicMock)); when(dnsZoneDao.findById(ZONE_ID)).thenReturn(zoneVO); when(dnsServerDao.findById(SERVER_ID)).thenReturn(serverVO); // collision on the new FQDN - org.apache.cloudstack.dns.vo.DnsNicJoinVO colliding = - mock(org.apache.cloudstack.dns.vo.DnsNicJoinVO.class); + NicDnsJoinVO colliding = + mock(NicDnsJoinVO.class); when(colliding.getInstanceId()).thenReturn(999L); - when(dnsNicJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(colliding); - when(dnsNicJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(63L), eq(ZONE_ID), anyString())) + when(nicDnsJoinDao.findActiveByDnsRecordAndZone(anyString(), eq(ZONE_ID))).thenReturn(colliding); + when(nicDnsJoinDao.listActiveByVmIdZoneAndDnsRecord(eq(63L), eq(ZONE_ID), anyString())) .thenReturn(Collections.emptyList()); try (MockedStatic txMock = diff --git a/test/integration/smoke/test_dns_framework_powerdns.py b/test/integration/smoke/test_dns_framework_powerdns.py index 51efcb360b8..1dfdca35c33 100644 --- a/test/integration/smoke/test_dns_framework_powerdns.py +++ b/test/integration/smoke/test_dns_framework_powerdns.py @@ -17,6 +17,7 @@ from marvin.cloudstackTestCase import cloudstackTestCase from marvin.cloudstackAPI import * +from nose.plugins.attrib import attr import subprocess import time @@ -85,7 +86,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): cls.pdns_url = f"http://{cls.marvin_vm_ip}" cls.logger.info(f"PDNS endpoint: {cls.pdns_url}") - + @attr(tags=["advanced"], required_hardware="true") def test_01_list_dns_providers(self): """ List DNS providers, expect PowerDNS provider to be present @@ -96,6 +97,8 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertIsNotNone(response, "Failed to list DNS providers") self.logger.info(f"DNS Providers found: {[provider.name for provider in response]}") + + @attr(tags=["advanced"], required_hardware="true") def test_02_add_dns_server(self): """ Register PDNS as DNS provider in CloudStack @@ -109,6 +112,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertIsNotNone(response.id, "DNS server ID should not be None") + @attr(tags=["advanced"], required_hardware="true") def test_03_list_dns_servers(self): """ List DNS servers and verify the newly added PDNS provider is present @@ -122,6 +126,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertEqual(response[0].id, self.dns_server_id, "DNS server ID mismatch") + @attr(tags=["advanced"], required_hardware="true") def test_04_create_dns_zone(self): """ Create a DNS zone in the added PDNS provider @@ -134,6 +139,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.logger.info(f"DNS Zone created: {response.id}") + @attr(tags=["advanced"], required_hardware="true") def test_05_list_dns_zones(self): """ List DNS zones and verify the newly created zone is present @@ -147,6 +153,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertEqual(response[0].id, self.dns_zone_id, "DNS zone ID mismatch") self.assertEqual(response[0].name, "example.com", "DNS zone name mismatch") + @attr(tags=["advanced"], required_hardware="true") def test_06_create_a_dns_record(self): """ Create a DNS record in the previously created zone @@ -162,6 +169,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertEqual(response.name, "www.example.com", "DNS record name mismatch") self._assert_dns("www.example.com", "A", expected="10.1.1.10") + @attr(tags=["advanced"], required_hardware="true") def test_07_create_aaaa_dns_records(self): """ Create AAAA DNS records in the previously created zone @@ -177,7 +185,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self.assertTrue(response.name is not None, "DNS record name should not be None") self._assert_dns("www.example.com", "AAAA", expected="2001:db8::10") - + @attr(tags=["advanced"], required_hardware="true") def test_08_create_mx_dns_record(self): """ Create an MX DNS record in the previously created zone @@ -194,6 +202,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): self._assert_dns("example.com", "MX", contains=["10", "mail.example.com"]) + @attr(tags=["advanced"], required_hardware="true") def test_09_list_dns_records(self): """ List DNS records in the zone and verify the created records are present @@ -207,7 +216,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): record_types = set(record.type for record in response) self.assertSetEqual(record_types, {"NS", "A", "AAAA", "MX"}, "DNS record types mismatch") - + @attr(tags=["advanced"], required_hardware="true") def test_10_delete_dns_record(self): """ Delete one of the DNS records and verify it's removed @@ -229,6 +238,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): remaining_record_names = set(record.name for record in response_after_deletion) self.assertNotIn(delete_record_cmd.name, remaining_record_names, "Deleted DNS record still present") + @attr(tags=["advanced"], required_hardware="true") def test_11_delete_dns_zone(self): """ Delete the DNS zone and verify it's removed @@ -249,6 +259,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): except Exception as e: self.logger.info(f"Expected exception after delete: {str(e)}") + @attr(tags=["advanced"], required_hardware="true") def test_12_delete_dns_server(self): """ Delete the PDNS DNS server and verify it's removed @@ -324,7 +335,7 @@ class TestCloudStackDNSFramework(cloudstackTestCase): def _dig(self, name, rtype): dns_ip = self.__class__.marvin_vm_ip - dns_port = 5353 + dns_port = 53 cmd = [ "dig", diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 100d8c196d1..fec7f5f9625 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -959,13 +959,13 @@ "label.dns.delete.zone": "Delete DNS Zone", "label.dns.dnsapikey": "DNS API key", "label.dns.externalserverid": "DNS server ID", +"label.dns.name": "DNS Name", "label.dns.publicdomainsuffix": "Public domain suffix", "label.dns.records": "DNS Records", "label.dns.record.name.tooltip": "The hostname or subdomain for this record (e.g. www)", "label.dns.record.type.tooltip": "The DNS record type", "label.dns.record.contents.tooltip": "The content values for this DNS record (type and press Enter to add)", "label.dns.record.ttl.tooltip": "Time to live in seconds", -"label.dns.record.url": "Instance URL", "label.dns.server": "DNS Server", "label.dnsserverid": "DNS Server ID", "label.dnsservername": "DNS Server name", diff --git a/ui/src/views/network/NicsTable.vue b/ui/src/views/network/NicsTable.vue index 68655d2111d..f6d3ae72356 100644 --- a/ui/src/views/network/NicsTable.vue +++ b/ui/src/views/network/NicsTable.vue @@ -58,8 +58,8 @@ {{ record.isolationuri }} - - {{ record.dnsrecordurl }} + + {{ record.nicdnsname }}