From caf85330bb7d9346129dd36c8040c6c70329078d Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Tue, 3 Mar 2026 14:08:50 +0530 Subject: [PATCH] 1. implement event processing for vm start/stop/destroy, nic create/delete events 2. add dnsrecordurl in nic_details table 3. add dnsrecordurl in vm response --- .../apache/cloudstack/api/ApiConstants.java | 1 + .../DisassociateDnsZoneFromNetworkCmd.java | 9 +- .../cloudstack/api/response/NicResponse.java | 8 ++ .../apache/cloudstack/dns/DnsProvider.java | 2 +- .../cloudstack/dns/DnsProviderManager.java | 2 +- .../META-INF/db/views/cloud.user_vm_view.sql | 4 +- .../dns/powerdns/PowerDnsClient.java | 2 +- .../dns/powerdns/PowerDnsProvider.java | 4 +- .../api/query/dao/UserVmJoinDaoImpl.java | 17 ++- .../com/cloud/api/query/vo/UserVmJoinVO.java | 12 +- .../dns/DnsProviderManagerImpl.java | 127 ++++++++---------- .../dns/DnsVmLifecycleListener.java | 54 ++++---- .../dns/dao/DnsZoneNetworkMapDao.java | 4 +- .../dns/dao/DnsZoneNetworkMapDaoImpl.java | 6 +- ui/src/views/network/NicsTable.vue | 4 + 15 files changed, 136 insertions(+), 120 deletions(-) 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 13dd0305a00..5f7a4fafb74 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -1353,6 +1353,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 PARAMETER_DESCRIPTION_ACTIVATION_RULE = "Quota tariff's activation rule. It can receive a JS script that results in either " + diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java index 80db66c0ec0..51808323b7c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java @@ -45,13 +45,12 @@ import com.cloud.user.Account; authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}) public class DisassociateDnsZoneFromNetworkCmd extends BaseCmd { - @Parameter(name = ApiConstants.DNS_ZONE_ID, type = CommandType.UUID, entityType = DnsZoneResponse.class, - required = true, description = "The ID of the DNS zone") + @Parameter(name = ApiConstants.DNS_ZONE_ID, type = CommandType.UUID, entityType = DnsZoneResponse.class, description = "The ID of the DNS zone") private Long dnsZoneId; @ACL(accessType = SecurityChecker.AccessType.OperateEntry) @Parameter(name = ApiConstants.NETWORK_ID, type = CommandType.UUID, entityType = NetworkResponse.class, - required = true, description = "The ID of the network") + required = true, description = "The ID of the Network") private Long networkId; @Override @@ -78,7 +77,7 @@ public class DisassociateDnsZoneFromNetworkCmd extends BaseCmd { return dnsZoneId; } - public void setDnsZoneId(Long dnsZoneId) { - this.dnsZoneId = dnsZoneId; + public Long getNetworkId() { + return networkId; } } 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 f992514b8db..95b5fb401d2 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 @@ -146,6 +146,10 @@ public class NicResponse extends BaseResponse { @Param(description = "Public IP address associated with this NIC via Static NAT rule") private String publicIp; + @SerializedName("dnsrecordurl") + @Param(description = "Public IP address associated with this NIC via Static NAT rule") + private String dnsRecordUrl; + public void setVmId(String vmId) { this.vmId = vmId; } @@ -416,4 +420,8 @@ public class NicResponse extends BaseResponse { public void setPublicIp(String publicIp) { this.publicIp = publicIp; } + + public void setDnsRecordUrl(String dnsRecordUrl) { + this.dnsRecordUrl = dnsRecordUrl; + } } diff --git a/api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java b/api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java index 809dad4f647..56e5c5b8abf 100644 --- a/api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java +++ b/api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java @@ -40,5 +40,5 @@ public interface DnsProvider extends Adapter { String addRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException; List listRecords(DnsServer server, DnsZone zone) throws DnsProviderException; String updateRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException; - void deleteRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException; + String deleteRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException; } diff --git a/api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java b/api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java index f9b4ecfd582..f1af22681ba 100644 --- a/api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java +++ b/api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java @@ -77,5 +77,5 @@ public interface DnsProviderManager extends Manager, PluggableService { void checkDnsServerPermissions(Account caller, DnsServer server); - boolean processDnsRecordForInstance(VirtualMachine instance, Network network, Nic nic, boolean isAdd); + String processDnsRecordForInstance(VirtualMachine instance, Network network, Nic nic, boolean isAdd); } 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 94bc8640fd5..ac2d007bd2b 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 @@ -141,6 +141,7 @@ SELECT `nics`.`mac_address` AS `mac_address`, `nics`.`broadcast_uri` AS `broadcast_uri`, `nics`.`isolation_uri` AS `isolation_uri`, + `nic_details`.`value` AS `dns_record_url`, `vpc`.`id` AS `vpc_id`, `vpc`.`uuid` AS `vpc_uuid`, `networks`.`uuid` AS `network_uuid`, @@ -185,7 +186,7 @@ SELECT `lease_expiry_action`.`value` AS `lease_expiry_action`, `lease_action_execution`.`value` AS `lease_action_execution` FROM - (((((((((((((((((((((((((((((((((((((`user_vm` + ((((((((((((((((((((((((((((((((((((((`user_vm` JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) AND ISNULL(`vm_instance`.`removed`)))) JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) @@ -212,6 +213,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 `networks` ON ((`nics`.`network_id` = `networks`.`id`))) LEFT JOIN `vpc` ON (((`networks`.`vpc_id` = `vpc`.`id`) AND ISNULL(`vpc`.`removed`)))) diff --git a/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsClient.java b/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsClient.java index 27a322f7e39..4abe2b0b02d 100644 --- a/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsClient.java +++ b/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsClient.java @@ -223,7 +223,7 @@ public class PowerDnsClient implements AutoCloseable { HttpPatch request = new HttpPatch(buildUrl(baseUrl, port, "/servers/" + externalServerId + "/zones/" + encodedZone)); request.setEntity(new org.apache.http.entity.StringEntity(root.toString(), StandardCharsets.UTF_8)); execute(request, apiKey, 204); - return normalizedRecord; + return normalizedRecord.endsWith(".") ? normalizedRecord.substring(0, normalizedRecord.length() - 1) : normalizedRecord; } public Iterable listRecords(String baseUrl, Integer port, String apiKey, String externalServerId, String zoneName) throws DnsProviderException { diff --git a/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsProvider.java b/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsProvider.java index 44862ff2e25..897488e5a57 100644 --- a/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsProvider.java +++ b/plugins/dns/powerdns/src/main/java/org/apache/cloudstack/dns/powerdns/PowerDnsProvider.java @@ -105,9 +105,9 @@ public class PowerDnsProvider extends AdapterBase implements DnsProvider { } @Override - public void deleteRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException { + public String deleteRecord(DnsServer server, DnsZone zone, DnsRecord record) throws DnsProviderException { validateRequiredServerAndZoneFields(server, zone); - applyRecord(server.getUrl(), + return applyRecord(server.getUrl(), server.getPort(), server.getApiKey(), server.getExternalServerId(), 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 93dca8cc07a..0d09083ccdf 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 @@ -17,14 +17,13 @@ package com.cloud.api.query.dao; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collections; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.Date; - import java.util.HashMap; import java.util.Hashtable; import java.util.List; @@ -34,8 +33,6 @@ import java.util.stream.Collectors; import javax.inject.Inject; -import com.cloud.gpu.dao.VgpuProfileDao; -import com.cloud.service.dao.ServiceOfferingDao; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; @@ -61,11 +58,13 @@ import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiResponseHelper; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.gpu.GPU; +import com.cloud.gpu.dao.VgpuProfileDao; import com.cloud.host.ControlState; import com.cloud.network.IpAddress; import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.service.ServiceOfferingDetailsVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOS; import com.cloud.storage.Storage.TemplateType; @@ -92,9 +91,9 @@ import com.cloud.vm.VMInstanceDetailVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VmStats; +import com.cloud.vm.dao.NicDetailsDao; import com.cloud.vm.dao.NicExtraDhcpOptionDao; import com.cloud.vm.dao.NicSecondaryIpVO; - import com.cloud.vm.dao.VMInstanceDetailsDao; @Component @@ -128,6 +127,8 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation VmDetailSearch; private final SearchBuilder activeVmByIsoSearch; @@ -358,6 +359,7 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation mappings = dnsZoneNetworkMapDao.listByNetworkId(networkId); - if (mappings == null || mappings.isEmpty()) { - logger.warn("No DNS zones are mapped to this network. Please associate a zone first."); - return false; + DnsZoneNetworkMapVO dnsZoneNetworkMap = dnsZoneNetworkMapDao.findByNetworkId(networkId); + if (dnsZoneNetworkMap == null) { + logger.warn("No DNS zone is mapped to this network. Please associate a zone first."); + return null; + } + DnsZoneVO dnsZone = dnsZoneDao.findById(dnsZoneNetworkMap.getDnsZoneId()); + if (dnsZone == null || dnsZone.getState() != DnsZone.State.Active) { + return null; + } + DnsServerVO server = dnsServerDao.findById(dnsZone.getDnsServerId()); + // Construct FQDN Prefix (e.g., "instance-id" or "instance-id.subdomain") + String recordName = String.valueOf(instance.getInstanceName()); + if (StringUtils.isNotBlank(dnsZoneNetworkMap.getSubDomain())) { + recordName = recordName + "." + dnsZoneNetworkMap.getSubDomain(); } - boolean atLeastOneSuccess = false; - for (DnsZoneNetworkMapVO map : mappings) { - DnsZoneVO zone = dnsZoneDao.findById(map.getDnsZoneId()); - if (zone == null || zone.getState() != DnsZone.State.Active) { - continue; - } - DnsServerVO server = dnsServerDao.findById(zone.getDnsServerId()); - // Construct FQDN Prefix (e.g., "instance-id" or "instance-id.subdomain") - String recordName = String.valueOf(instance.getInstanceName()); - if (StringUtils.isNotBlank(map.getSubDomain())) { - recordName = recordName + "." + map.getSubDomain(); - } - try { - DnsProvider provider = getProviderByType(server.getProviderType()); - // Handle IPv4 (A Record) - if (nic.getIPv4Address() != null) { - DnsRecord recordA = new DnsRecord(recordName, DnsRecord.RecordType.A, Collections.singletonList(nic.getIPv4Address()), 3600); - if (isAdd) { - provider.addRecord(server, zone, recordA); - } else { - provider.deleteRecord(server, zone, recordA); - } - atLeastOneSuccess = true; + try { + DnsProvider provider = getProviderByType(server.getProviderType()); + // Handle IPv4 (A Record) + String ipv4DnsRecord = null; + if (nic.getIPv4Address() != null) { + DnsRecord recordA = new DnsRecord(recordName, DnsRecord.RecordType.A, Collections.singletonList(nic.getIPv4Address()), 3600); + if (isAdd) { + ipv4DnsRecord = provider.addRecord(server, dnsZone, recordA); + } else { + ipv4DnsRecord = provider.deleteRecord(server, dnsZone, recordA); } - - // Handle IPv6 (AAAA Record) if it exists - if (nic.getIPv6Address() != null) { - DnsRecord recordAAAA = new DnsRecord(recordName, DnsRecord.RecordType.AAAA, Collections.singletonList(nic.getIPv6Address()), 3600); - if (isAdd) { - provider.addRecord(server, zone, recordAAAA); - } else { - provider.deleteRecord(server, zone, recordAAAA); - } - atLeastOneSuccess = true; - } - - } catch (Exception ex) { - logger.error( - "Failed to {} DNS record for Instance {} in zone {}", - isAdd ? "register" : "remove", - instance.getHostName(), - zone.getName(), - ex - ); - return false; } - } - if (!atLeastOneSuccess) { - logger.error("Failed to process DNS records. Ensure the Instance has a valid IP address."); - return false; + // Handle IPv6 (AAAA Record) if it exists + String ipv6DnsRecord = null; + if (nic.getIPv6Address() != null) { + DnsRecord recordAAAA = new DnsRecord(recordName, DnsRecord.RecordType.AAAA, Collections.singletonList(nic.getIPv6Address()), 3600); + if (isAdd) { + ipv6DnsRecord = provider.addRecord(server, dnsZone, recordAAAA); + } else { + ipv6DnsRecord = provider.deleteRecord(server, dnsZone, recordAAAA); + } + } + return ipv4DnsRecord != null ? ipv4DnsRecord : ipv6DnsRecord; + } catch (Exception ex) { + logger.error( + "Failed to {} DNS record for Instance {} in zone {}", + isAdd ? "register" : "remove", + instance.getHostName(), + dnsZone.getName(), + ex + ); } - return true; + return null; } @Override diff --git a/server/src/main/java/org/apache/cloudstack/dns/DnsVmLifecycleListener.java b/server/src/main/java/org/apache/cloudstack/dns/DnsVmLifecycleListener.java index 5ebf5f928d5..53f6fb62105 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/DnsVmLifecycleListener.java +++ b/server/src/main/java/org/apache/cloudstack/dns/DnsVmLifecycleListener.java @@ -41,6 +41,7 @@ import com.cloud.vm.Nic; import com.cloud.vm.NicVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.NicDetailsDao; import com.cloud.vm.dao.VMInstanceDao; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -60,6 +61,8 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib NicDao nicDao; @Inject DnsProviderManager providerManager; + @Inject + NicDetailsDao nicDetailsDao; @Override public boolean configure(final String name, final Map params) { @@ -69,6 +72,7 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib } try { eventBus.subscribe(new EventTopic(null, EventTypes.EVENT_VM_CREATE, null, null, null), this); + eventBus.subscribe(new EventTopic(null, EventTypes.EVENT_VM_START, null, null, null), this); eventBus.subscribe(new EventTopic(null, EventTypes.EVENT_VM_STOP, null, null, null), this); eventBus.subscribe(new EventTopic(null, EventTypes.EVENT_VM_DESTROY, null, null, null), this); eventBus.subscribe(new EventTopic(null, EventTypes.EVENT_NIC_CREATE, null, null, null), this); @@ -81,7 +85,6 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib @Override public void onEvent(Event event) { - logger.debug("Received EventBus event: {}", event); JsonNode descJson = parseEventDescription(event); if (!isEventCompleted(descJson)) { return; @@ -89,7 +92,6 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib String eventType = event.getEventType(); String resourceUuid = event.getResourceUUID(); - logger.debug("Processing Event: {}", event); try { switch (eventType) { case EventTypes.EVENT_VM_CREATE: @@ -112,15 +114,13 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib } catch (Exception ex) { logger.error("Failed to process DNS lifecycle event: type={}, resourceUuid={}", eventType, event.getResourceUUID(), ex); - } } private void handleNicEvent(JsonNode eventDesc, boolean isAddDnsRecord) { JsonNode nicUuid = eventDesc.get("Nic"); JsonNode vmUuid = eventDesc.get("VirtualMachine"); - JsonNode networkUuid = eventDesc.get("Network"); - if (nicUuid == null || nicUuid.isNull() || vmUuid == null || vmUuid.isNull() || networkUuid == null || networkUuid.isNull()) { + if (nicUuid == null || nicUuid.isNull() || vmUuid == null || vmUuid.isNull()) { logger.warn("Event has missing data to work on: {}", eventDesc); return; } @@ -129,22 +129,17 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib logger.error("Unable to find Instance with ID: {}", vmUuid); return; } - - Network network = networkDao.findByUuid(networkUuid.asText()); + Nic nic = nicDao.findByUuidIncludingRemoved(nicUuid.asText()); + if (nic == null) { + logger.error("NIC is not found for the ID: {}", nicUuid); + return; + } + Network network = networkDao.findById(nic.getNetworkId()); if (network == null || !Network.GuestType.Shared.equals(network.getGuestType())) { logger.warn("Network is not eligible for DNS record registration"); return; } - Nic nic = nicDao.findByUuid(nicUuid.asText()); - if (nic == null) { - logger.error("NIC is not found for the ID: {}", nicUuid); - } - - boolean dnsRecordAdded = providerManager.processDnsRecordForInstance(vmInstanceVO, network, nic, isAddDnsRecord); - if (!dnsRecordAdded) { - logger.error("Failure {} DNS record for Instance: {} for Network with ID: {}", - isAddDnsRecord ? "adding" : "removing", vmUuid, networkUuid); - } + processEventForDnsRecord(vmInstanceVO, network, nic, isAddDnsRecord); } private void handleVmEvent(String vmUuid, boolean isAddDnsRecord) { @@ -156,13 +151,24 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib List vmNics = nicDao.listByVmId(vmInstanceVO.getId()); for (NicVO nic : vmNics) { Network network = networkDao.findById(nic.getNetworkId()); - if (Network.GuestType.Shared.equals(network.getGuestType())) { - boolean dnsRecordAdded = providerManager.processDnsRecordForInstance(vmInstanceVO, network, nic, isAddDnsRecord); - if (!dnsRecordAdded) { - logger.error("Failure {} DNS record for Instance: {} for Network with ID: {}", - isAddDnsRecord ? "adding" : "removing", vmUuid, network.getUuid()); - } + if (network == null || !Network.GuestType.Shared.equals(network.getGuestType())) { + continue; } + processEventForDnsRecord(vmInstanceVO, network, nic, isAddDnsRecord); + } + } + + void processEventForDnsRecord(VMInstanceVO vmInstanceVO, Network network, Nic nic, boolean isAddDnsRecord) { + String dnsRecordUrl = providerManager.processDnsRecordForInstance(vmInstanceVO, network, nic, isAddDnsRecord); + if (dnsRecordUrl != null) { + if (isAddDnsRecord) { + nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD, dnsRecordUrl, true); + } else { + nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD); + } + } else { + logger.error("Failure {} DNS record for Instance: {} for Network with ID: {}", + isAddDnsRecord ? "adding" : "removing", vmInstanceVO.getUuid(), network.getUuid()); } } @@ -188,6 +194,8 @@ public class DnsVmLifecycleListener extends ManagerBase implements EventSubscrib if (statusNode == null || statusNode.isNull()) { return false; } + + logger.debug("Processing Event: {}", descJson); return ApiConstants.COMPLETED.equalsIgnoreCase(statusNode.asText()); } } diff --git a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java b/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java index 1d522d0f16b..29e9190d542 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java +++ b/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDao.java @@ -17,13 +17,11 @@ package org.apache.cloudstack.dns.dao; -import java.util.List; - import org.apache.cloudstack.dns.vo.DnsZoneNetworkMapVO; import com.cloud.utils.db.GenericDao; public interface DnsZoneNetworkMapDao extends GenericDao { DnsZoneNetworkMapVO findByZoneAndNetwork(long dnsZoneId, long networkId); - List listByNetworkId(long networkId); + DnsZoneNetworkMapVO findByNetworkId(long networkId); } diff --git a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImpl.java b/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImpl.java index aec93a500ad..01a8718a895 100644 --- a/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImpl.java +++ b/server/src/main/java/org/apache/cloudstack/dns/dao/DnsZoneNetworkMapDaoImpl.java @@ -17,8 +17,6 @@ package org.apache.cloudstack.dns.dao; -import java.util.List; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.dns.vo.DnsZoneNetworkMapVO; import org.springframework.stereotype.Component; @@ -54,9 +52,9 @@ public class DnsZoneNetworkMapDaoImpl extends GenericDaoBase listByNetworkId(long networkId) { + public DnsZoneNetworkMapVO findByNetworkId(long networkId) { SearchCriteria sc = NetworkSearch.create(); sc.setParameters(ApiConstants.NETWORK_ID, networkId); - return listBy(sc); + return findOneBy(sc); } } diff --git a/ui/src/views/network/NicsTable.vue b/ui/src/views/network/NicsTable.vue index a31925a6b37..e9e15a0aa90 100644 --- a/ui/src/views/network/NicsTable.vue +++ b/ui/src/views/network/NicsTable.vue @@ -57,6 +57,10 @@ {{ record.isolationuri }} + + + {{ record.dns_url }} +