Skip to content

Commit af7ce8e

Browse files
committed
fix addDnsRecord and deleteDnsRecord flow for automatic registration and ownership issue for associate/disassociate dnsZoneToNetwork
1 parent 981bb64 commit af7ce8e

File tree

4 files changed

+69
-26
lines changed

4 files changed

+69
-26
lines changed

api/src/main/java/org/apache/cloudstack/api/command/user/dns/DisassociateDnsZoneFromNetworkCmd.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.apache.cloudstack.api.BaseCmd;
2727
import org.apache.cloudstack.api.Parameter;
2828
import org.apache.cloudstack.api.ServerApiException;
29-
import org.apache.cloudstack.api.response.DnsZoneResponse;
3029
import org.apache.cloudstack.api.response.NetworkResponse;
3130
import org.apache.cloudstack.api.response.SuccessResponse;
3231

@@ -35,6 +34,7 @@
3534
import com.cloud.exception.NetworkRuleConflictException;
3635
import com.cloud.exception.ResourceAllocationException;
3736
import com.cloud.exception.ResourceUnavailableException;
37+
import com.cloud.network.Network;
3838
import com.cloud.user.Account;
3939

4040
@APICommand(name = "disassociateDnsZoneFromNetwork",
@@ -45,9 +45,6 @@
4545
authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
4646
public class DisassociateDnsZoneFromNetworkCmd extends BaseCmd {
4747

48-
@Parameter(name = ApiConstants.DNS_ZONE_ID, type = CommandType.UUID, entityType = DnsZoneResponse.class, description = "The ID of the DNS zone")
49-
private Long dnsZoneId;
50-
5148
@ACL(accessType = SecurityChecker.AccessType.OperateEntry)
5249
@Parameter(name = ApiConstants.NETWORK_ID, type = CommandType.UUID, entityType = NetworkResponse.class,
5350
required = true, description = "The ID of the Network")
@@ -70,13 +67,13 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
7067

7168
@Override
7269
public long getEntityOwnerId() {
70+
Network network = _entityMgr.findById(Network.class, networkId);
71+
if (network != null) {
72+
return network.getAccountId();
73+
}
7374
return Account.ACCOUNT_ID_SYSTEM;
7475
}
7576

76-
public Long getDnsZoneId() {
77-
return dnsZoneId;
78-
}
79-
8077
public Long getNetworkId() {
8178
return networkId;
8279
}

api/src/main/java/org/apache/cloudstack/dns/DnsProviderManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public interface DnsProviderManager extends Manager, PluggableService {
7575

7676
boolean disassociateZoneFromNetwork(DisassociateDnsZoneFromNetworkCmd cmd);
7777

78-
String processDnsRecordForInstance(VirtualMachine instance, Network network, Nic nic, boolean isAdd);
78+
void addDnsRecordForVM(VirtualMachine instance, Network network, Nic nic);
79+
void deleteDnsRecordForVM(VirtualMachine instance, Network network, Nic nic);
7980

8081
void checkDnsServerPermission(Account caller, DnsServer dnsServer);
8182

server/src/main/java/org/apache/cloudstack/dns/DnsProviderManagerImpl.java

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.apache.cloudstack.dns.vo.DnsZoneJoinVO;
6060
import org.apache.cloudstack.dns.vo.DnsZoneNetworkMapVO;
6161
import org.apache.cloudstack.dns.vo.DnsZoneVO;
62+
import org.apache.logging.log4j.util.Strings;
6263
import org.springframework.stereotype.Component;
6364

6465
import com.cloud.domain.dao.DomainDao;
@@ -81,8 +82,10 @@
8182
import com.cloud.utils.db.TransactionCallback;
8283
import com.cloud.utils.exception.CloudRuntimeException;
8384
import com.cloud.vm.Nic;
85+
import com.cloud.vm.NicDetailVO;
8486
import com.cloud.vm.VirtualMachine;
8587
import com.cloud.vm.dao.NicDao;
88+
import com.cloud.vm.dao.NicDetailsDao;
8689
import com.cloud.vm.dao.UserVmDao;
8790

8891
@Component
@@ -110,6 +113,8 @@ public class DnsProviderManagerImpl extends ManagerBase implements DnsProviderMa
110113
DnsServerJoinDao dnsServerJoinDao;
111114
@Inject
112115
AccountDao accountDao;
116+
@Inject
117+
NicDetailsDao nicDetailsDao;
113118

114119
private DnsProvider getProviderByType(DnsProviderType type) {
115120
if (type == null) {
@@ -649,23 +654,69 @@ public boolean disassociateZoneFromNetwork(DisassociateDnsZoneFromNetworkCmd cmd
649654
}
650655

651656
@Override
652-
public String processDnsRecordForInstance(VirtualMachine instance, Network network, Nic nic, boolean isAdd) {
653-
long networkId = network.getId();
654-
DnsZoneNetworkMapVO dnsZoneNetworkMap = dnsZoneNetworkMapDao.findByNetworkId(networkId);
657+
public void addDnsRecordForVM(VirtualMachine instance, Network network, Nic nic) {
658+
DnsZoneNetworkMapVO dnsZoneNetworkMap = dnsZoneNetworkMapDao.findByNetworkId(network.getId());
655659
if (dnsZoneNetworkMap == null) {
656660
logger.warn("No DNS zone is mapped to this network. Please associate a zone first.");
657-
return null;
661+
return;
658662
}
659663
DnsZoneVO dnsZone = dnsZoneDao.findById(dnsZoneNetworkMap.getDnsZoneId());
660664
if (dnsZone == null || dnsZone.getState() != DnsZone.State.Active) {
661-
return null;
665+
logger.warn("DNS zone is not available for DNS record setup");
666+
return;
662667
}
663668
DnsServerVO server = dnsServerDao.findById(dnsZone.getDnsServerId());
669+
if (server == null) {
670+
logger.warn("DNS server is not found to process DNS record for Instance: {}", instance.getInstanceName());
671+
return;
672+
}
664673
// Construct FQDN Prefix (e.g., "instance-id.dnsZoneName" or "instance-id.subdomain.dnsZoneName")
665674
String recordName = String.valueOf(instance.getInstanceName());
666675
if (StringUtils.isNotBlank(dnsZoneNetworkMap.getSubDomain())) {
667676
recordName = String.join(".", recordName, dnsZoneNetworkMap.getSubDomain(), dnsZone.getName());
668677
}
678+
String dnsRecordUrl = processDnsRecordInProvider(recordName, instance, server, dnsZone, nic, true);
679+
if (Strings.isBlank(dnsRecordUrl)) {
680+
logger.error("Failed to add DNS record in provider for Instance: {}", instance.getInstanceName());
681+
return;
682+
}
683+
nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD, dnsRecordUrl, true);
684+
}
685+
686+
@Override
687+
public void deleteDnsRecordForVM(VirtualMachine instance, Network network, Nic nic) {
688+
String instanceName = instance.getInstanceName();
689+
NicDetailVO nicDetailVO = nicDetailsDao.findDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD);
690+
if (nicDetailVO == null || Strings.isBlank(nicDetailVO.getValue())) {
691+
logger.debug("No DNS record found for Instance: {}", instance.getInstanceName());
692+
return;
693+
}
694+
String dnsRecord = nicDetailVO.getValue();
695+
try {
696+
DnsZoneNetworkMapVO dnsZoneNetworkMap = dnsZoneNetworkMapDao.findByNetworkId(network.getId());
697+
DnsZoneVO dnsZone = null;
698+
DnsServerVO dnsServer = null;
699+
if (dnsZoneNetworkMap != null) {
700+
dnsZone = dnsZoneDao.findById(dnsZoneNetworkMap.getDnsZoneId());
701+
}
702+
if (dnsZone != null) {
703+
dnsServer = dnsServerDao.findById(dnsZone.getDnsServerId());
704+
}
705+
if (dnsServer != null) {
706+
processDnsRecordInProvider(dnsRecord, instance, dnsServer, dnsZone, nic, false);
707+
} else {
708+
logger.warn("Skipping deletion of DNS record: {} from provider for Instance: {}.", dnsRecord, instanceName);
709+
}
710+
} catch (Exception ex) {
711+
logger.error("Failed deleting DNS record: {} for Instance: {}, proceeding with DB cleanup.", dnsRecord, instanceName);
712+
} finally {
713+
nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD);
714+
logger.debug("Removed DNS record from DB for Instance: {}, NIC ID: {}", instanceName, nic.getUuid());
715+
}
716+
}
717+
718+
private String processDnsRecordInProvider(String recordName, VirtualMachine instance, DnsServer server, DnsZone dnsZone,
719+
Nic nic, boolean isAdd) {
669720

670721
try {
671722
DnsProvider provider = getProviderByType(server.getProviderType());
@@ -695,7 +746,7 @@ public String processDnsRecordForInstance(VirtualMachine instance, Network netwo
695746
logger.error(
696747
"Failed to {} DNS record for Instance {} in zone {}",
697748
isAdd ? "register" : "remove",
698-
instance.getHostName(),
749+
instance.getInstanceName(),
699750
dnsZone.getName(),
700751
ex
701752
);

server/src/main/java/org/apache/cloudstack/dns/DnsVmLifecycleListener.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ private void handleNicEvent(JsonNode eventDesc, boolean isAddDnsRecord) {
144144
}
145145

146146
private void handleVmEvent(String vmUuid, boolean isAddDnsRecord) {
147-
VMInstanceVO vmInstanceVO = vmInstanceDao.findByUuid(vmUuid);
147+
VMInstanceVO vmInstanceVO = vmInstanceDao.findByUuidIncludingRemoved(vmUuid);
148148
if (vmInstanceVO == null) {
149149
logger.error("Unable to find Instance with ID: {}", vmUuid);
150150
return;
151151
}
152-
List<NicVO> vmNics = nicDao.listByVmId(vmInstanceVO.getId());
152+
List<NicVO> vmNics = nicDao.listByVmIdIncludingRemoved(vmInstanceVO.getId());
153153
for (NicVO nic : vmNics) {
154154
Network network = networkDao.findById(nic.getNetworkId());
155155
if (network == null || !Network.GuestType.Shared.equals(network.getGuestType())) {
@@ -160,16 +160,10 @@ private void handleVmEvent(String vmUuid, boolean isAddDnsRecord) {
160160
}
161161

162162
void processEventForDnsRecord(VMInstanceVO vmInstanceVO, Network network, Nic nic, boolean isAddDnsRecord) {
163-
String dnsRecordUrl = providerManager.processDnsRecordForInstance(vmInstanceVO, network, nic, isAddDnsRecord);
164-
if (dnsRecordUrl != null) {
165-
if (isAddDnsRecord) {
166-
nicDetailsDao.addDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD, dnsRecordUrl, true);
167-
} else {
168-
nicDetailsDao.removeDetail(nic.getId(), ApiConstants.NIC_DNS_RECORD);
169-
}
163+
if (isAddDnsRecord) {
164+
providerManager.addDnsRecordForVM(vmInstanceVO, network, nic);
170165
} else {
171-
logger.error("Failure {} DNS record for Instance: {} for Network with ID: {}",
172-
isAddDnsRecord ? "adding" : "removing", vmInstanceVO.getUuid(), network.getUuid());
166+
providerManager.deleteDnsRecordForVM(vmInstanceVO, network, nic);
173167
}
174168
}
175169

0 commit comments

Comments
 (0)