diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java index c064e680366..a32e3879810 100644 --- a/api/src/main/java/com/cloud/event/EventTypes.java +++ b/api/src/main/java/com/cloud/event/EventTypes.java @@ -1423,8 +1423,10 @@ public class EventTypes { // DNS Framework Events entityEventDetails.put(EVENT_DNS_SERVER_ADD, DnsServer.class); + entityEventDetails.put(EVENT_DNS_SERVER_UPDATE, DnsServer.class); entityEventDetails.put(EVENT_DNS_SERVER_DELETE, DnsServer.class); entityEventDetails.put(EVENT_DNS_ZONE_CREATE, DnsZone.class); + entityEventDetails.put(EVENT_DNS_ZONE_UPDATE, DnsZone.class); entityEventDetails.put(EVENT_DNS_ZONE_DELETE, DnsZone.class); entityEventDetails.put(EVENT_DNS_RECORD_CREATE, DnsRecord.class); entityEventDetails.put(EVENT_DNS_RECORD_DELETE, DnsRecord.class); diff --git a/api/src/main/java/com/cloud/user/ResourceLimitService.java b/api/src/main/java/com/cloud/user/ResourceLimitService.java index 53a5a861469..9c493fb383c 100644 --- a/api/src/main/java/com/cloud/user/ResourceLimitService.java +++ b/api/src/main/java/com/cloud/user/ResourceLimitService.java @@ -57,8 +57,6 @@ public interface ResourceLimitService { "The default maximum number of GPU devices that can be used for a domain", false); static final ConfigKey DefaultMaxProjectGpus = new ConfigKey<>("Project Defaults",Long.class,"max.project.gpus","20", "The default maximum number of GPU devices that can be used for a project", false); - ConfigKey DefaultMaxDnsAccounts = new ConfigKey<>("Account Defaults",Long.class, "max.account.dns_zones","10", - "The default maximum number of DNS zones that can be created by an Account", true); static final List HostTagsSupportingTypes = List.of(ResourceType.user_vm, ResourceType.cpu, ResourceType.memory, ResourceType.gpu); static final List StorageTagsSupportingTypes = List.of(ResourceType.volume, ResourceType.primary_storage); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmd.java index 25c4b007cc8..10a706e3a81 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/CreateDnsZoneCmd.java @@ -88,7 +88,7 @@ public class CreateDnsZoneCmd extends BaseAsyncCreateCmd { return DnsZone.ZoneType.Public; } DnsZone.ZoneType zoneType = EnumUtils.getEnumIgnoreCase(DnsZone.ZoneType.class, type); - if (type == null) { + if (zoneType == null) { throw new IllegalArgumentException("Invalid type value, supported values are: " + Arrays.toString(DnsZone.ZoneType.values())); } return zoneType; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmd.java index dee8bc770a8..a6d5a710ae5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/DeleteDnsZoneCmd.java @@ -52,8 +52,8 @@ public class DeleteDnsZoneCmd extends BaseAsyncCmd { private Long id; @Parameter(name = ApiConstants.UNMANAGE, type = CommandType.BOOLEAN, entityType = DnsZoneResponse.class, - description = "If true, imports an existing DNS zone from the DNS provider into CloudStack; " + - "if false, creates the DNS zone in the provider and registers it with CloudStack. Default: false") + description = "If true, removes the DNS zone only from CloudStack; if false, removes it from " + + "both CloudStack and the DNS provider. Default: false") private Boolean unmanage = false; ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmd.java index 8d1ce80f1ff..53019d980c5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsServerCmd.java @@ -101,7 +101,15 @@ public class UpdateDnsServerCmd extends BaseCmd { public String getPublicDomainSuffix() { return publicDomainSuffix; } - public String getNameServers() { return String.join(",", nameServers); } + public String getNameServers() { + if (nameServers == null) { + return null; + } + return StringUtils.join(nameServers.stream() + .filter(StringUtils::isNotBlank) + .map(StringUtils::trim) + .toArray(String[]::new), ","); + } @Override public long getEntityOwnerId() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmd.java index 5e3af83a5da..5952b73ea6e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmd.java @@ -18,6 +18,8 @@ package org.apache.cloudstack.api.command.user.dns; import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -25,9 +27,10 @@ import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.DnsZoneResponse; -import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.dns.DnsZone; +import com.cloud.user.Account; + @APICommand(name = "updateDnsZone", description = "Updates a DNS Zone's metadata", responseObject = DnsZoneResponse.class, @@ -41,6 +44,7 @@ public class UpdateDnsZoneCmd extends BaseCmd { //////////////// API Parameters ///////////////////// ///////////////////////////////////////////////////// + @ACL(accessType = SecurityChecker.AccessType.OperateEntry) @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DnsZoneResponse.class, required = true, description = "The ID of the DNS zone") private Long id; @@ -82,6 +86,10 @@ public class UpdateDnsZoneCmd extends BaseCmd { @Override public long getEntityOwnerId() { - return CallContext.current().getCallingAccount().getId(); + DnsZone dnsZone = _entityMgr.findById(DnsZone.class, id); + if (dnsZone != null) { + return dnsZone.getAccountId(); + } + return Account.ACCOUNT_ID_SYSTEM; } } diff --git a/api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmdTest.java index 4573b28fc8d..cac16903185 100644 --- a/api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmdTest.java +++ b/api/src/test/java/org/apache/cloudstack/api/command/user/dns/UpdateDnsZoneCmdTest.java @@ -26,11 +26,14 @@ import org.apache.cloudstack.api.response.DnsZoneResponse; import org.apache.cloudstack.dns.DnsZone; import org.junit.Test; +import com.cloud.user.Account; + public class UpdateDnsZoneCmdTest extends BaseDnsCmdTest { private UpdateDnsZoneCmd createCmd() throws Exception { UpdateDnsZoneCmd cmd = new UpdateDnsZoneCmd(); setField(cmd, "dnsProviderManager", dnsProviderManager); + setField(cmd, "_entityMgr", entityManager); setField(cmd, "id", ENTITY_ID); setField(cmd, "description", "Updated description"); return cmd; @@ -44,11 +47,21 @@ public class UpdateDnsZoneCmdTest extends BaseDnsCmdTest { } @Test - public void testGetEntityOwnerId() throws Exception { + public void testGetEntityOwnerIdWhenZoneExists() throws Exception { UpdateDnsZoneCmd cmd = createCmd(); + DnsZone mockZone = mock(DnsZone.class); + when(mockZone.getAccountId()).thenReturn(ACCOUNT_ID); + when(entityManager.findById(DnsZone.class, ENTITY_ID)).thenReturn(mockZone); assertEquals(ACCOUNT_ID, cmd.getEntityOwnerId()); } + @Test + public void testGetEntityOwnerIdWhenZoneNotFound() throws Exception { + UpdateDnsZoneCmd cmd = createCmd(); + when(entityManager.findById(DnsZone.class, ENTITY_ID)).thenReturn(null); + assertEquals(Account.ACCOUNT_ID_SYSTEM, cmd.getEntityOwnerId()); + } + @Test public void testExecuteSuccess() throws Exception { UpdateDnsZoneCmd cmd = createCmd();