From ec4efbe1597f03589c3d3615a169d1b652901ea4 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 26 May 2022 12:02:16 +0530 Subject: [PATCH 01/26] api,server: custom dns for guest network Signed-off-by: Abhishek Kumar --- .../main/java/com/cloud/network/Network.java | 8 ++ .../java/com/cloud/network/NetworkModel.java | 12 +- .../com/cloud/network/NetworkProfile.java | 22 ++++ .../user/network/CreateNetworkCmd.java | 28 +++++ .../service/NetworkOrchestrationService.java | 3 +- .../orchestration/NetworkOrchestrator.java | 29 ++++- .../main/java/com/cloud/dc/DataCenterVO.java | 10 +- .../java/com/cloud/network/dao/NetworkVO.java | 45 +++++++- .../META-INF/db/schema-41610to41700.sql | 5 + .../networkservice/BaremetaNetworkGuru.java | 14 ++- .../cluster/KubernetesClusterManagerImpl.java | 106 +++++++++--------- .../cloud/network/IpAddressManagerImpl.java | 13 ++- .../cloud/network/Ipv6AddressManagerImpl.java | 6 +- .../com/cloud/network/Ipv6ServiceImpl.java | 7 +- .../com/cloud/network/NetworkModelImpl.java | 42 +++++++ .../com/cloud/network/NetworkServiceImpl.java | 35 +++++- .../cloud/network/guru/DirectNetworkGuru.java | 23 ++-- .../guru/DirectPodBasedNetworkGuru.java | 11 +- .../guru/ExternalGuestNetworkGuru.java | 6 +- .../cloud/network/guru/GuestNetworkGuru.java | 24 +++- .../network/guru/PrivateNetworkGuru.java | 20 ++-- .../cloud/network/guru/PublicNetworkGuru.java | 20 +++- .../network/router/CommandSetupHelper.java | 19 ++-- .../VirtualNetworkApplianceManagerImpl.java | 9 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 2 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 4 +- .../network/CreatePrivateNetworkTest.java | 2 +- .../cloud/network/Ipv6AddressManagerTest.java | 8 +- .../cloud/network/MockNetworkModelImpl.java | 11 ++ .../com/cloud/vpc/MockNetworkManagerImpl.java | 4 +- .../com/cloud/vpc/MockNetworkModelImpl.java | 12 ++ .../network/CreateIsolatedNetworkForm.vue | 84 ++++++++++---- 32 files changed, 480 insertions(+), 164 deletions(-) diff --git a/api/src/main/java/com/cloud/network/Network.java b/api/src/main/java/com/cloud/network/Network.java index 49408b9110da..0fee5c04d25c 100644 --- a/api/src/main/java/com/cloud/network/Network.java +++ b/api/src/main/java/com/cloud/network/Network.java @@ -483,5 +483,13 @@ public void setIp6Address(String ip6Address) { String getRouterIpv6(); + String getDns1(); + + String getDns2(); + + String getIp6Dns1(); + + String getIp6Dns2(); + Date getCreated(); } diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java index 971bb308b1da..ca8ceb6cdd6a 100644 --- a/api/src/main/java/com/cloud/network/NetworkModel.java +++ b/api/src/main/java/com/cloud/network/NetworkModel.java @@ -17,13 +17,14 @@ package com.cloud.network; -import com.google.common.collect.ImmutableMap; - import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.cloudstack.framework.config.ConfigKey; + +import com.cloud.dc.DataCenter; import com.cloud.dc.Vlan; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; @@ -39,10 +40,11 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Detail; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachine; -import org.apache.cloudstack.framework.config.ConfigKey; +import com.google.common.collect.ImmutableMap; /** * The NetworkModel presents a read-only view into the Network data such as L2 networks, @@ -323,4 +325,8 @@ List generateVmData(String userData, String serviceOffering, long data String getValidNetworkCidr(Network guestNetwork); + Pair getNetworkIp4Dns(final Network network, final DataCenter zone); + + Pair getNetworkIp6Dns(final Network network, final DataCenter zone); + } diff --git a/api/src/main/java/com/cloud/network/NetworkProfile.java b/api/src/main/java/com/cloud/network/NetworkProfile.java index f3c178767e85..5289bda62992 100644 --- a/api/src/main/java/com/cloud/network/NetworkProfile.java +++ b/api/src/main/java/com/cloud/network/NetworkProfile.java @@ -31,6 +31,8 @@ public class NetworkProfile implements Network { private final long domainId; private String dns1; private String dns2; + private String ip6Dns1; + private String ip6Dns2; private URI broadcastUri; private final State state; private boolean isRedundant; @@ -98,10 +100,12 @@ public NetworkProfile(Network network) { externalId = network.getExternalId(); } + @Override public String getDns1() { return dns1; } + @Override public String getDns2() { return dns2; } @@ -114,6 +118,24 @@ public void setDns2(String dns2) { this.dns2 = dns2; } + @Override + public String getIp6Dns1() { + return ip6Dns1; + } + + @Override + public String getIp6Dns2() { + return ip6Dns2; + } + + public void setIp6Dns1(String ip6Dns1) { + this.ip6Dns1 = ip6Dns1; + } + + public void setIp6Dns2(String ip6Dns2) { + this.ip6Dns2 = ip6Dns2; + } + @Override public String getGuruName() { return guruName; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 10aadee40e60..d8345a47e567 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -157,6 +157,18 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { description = "The network this network is associated to. only available if create a Shared network") private Long associatedNetworkId; + @Parameter(name = ApiConstants.DNS1, type = CommandType.STRING, required = true, description = "the first DNS for the network", since = "4.17.0") + private String ip4Dns1; + + @Parameter(name = ApiConstants.DNS2, type = CommandType.STRING, description = "the second DNS for the network", since = "4.17.0") + private String ip4Dns2; + + @Parameter(name = ApiConstants.IP6_DNS1, type = CommandType.STRING, description = "the first DNS for IPv6 network", since = "4.17.0") + private String ip6Dns1; + + @Parameter(name = ApiConstants.IP6_DNS2, type = CommandType.STRING, description = "the second DNS for IPv6 network", since = "4.17.0") + private String ip6Dns2; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -326,6 +338,22 @@ public Long getAclId() { return aclId; } + public String getIp4Dns1() { + return ip4Dns1; + } + + public String getIp4Dns2() { + return ip4Dns2; + } + + public String getIp6Dns1() { + return ip6Dns1; + } + + public String getIp6Dns2() { + return ip6Dns2; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index b79cce5f604e..4fafe274aee0 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -187,7 +187,8 @@ void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationC Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr, - Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; + Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6, + String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; UserDataServiceProvider getPasswordResetProvider(Network network); diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 3284511e01a5..8a3007fe938f 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -38,7 +38,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.server.ManagementServer; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; @@ -197,6 +196,7 @@ import com.cloud.offerings.dao.NetworkOfferingDetailsDao; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.resource.ResourceManager; +import com.cloud.server.ManagementServer; import com.cloud.user.Account; import com.cloud.user.ResourceLimitService; import com.cloud.user.User; @@ -2430,7 +2430,8 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n // create network for private gateway return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, - vpcId, null, null, true, null, null, null, true, null, null); + vpcId, null, null, true, null, null, null, true, null, null, + null, null, null, null); } @Override @@ -2438,18 +2439,21 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n public Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, - final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, + String routerIp, String routerIpv6, String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // create Isolated/Shared/L2 network return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, - isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6); + isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6, dns1, dns2, ip6Dns1, ip6Dns2); } @DB private Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, - final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, final Boolean isPrivateNetwork, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, + final Boolean isPrivateNetwork, String routerIp, String routerIpv6, final String dns1, final String dns2, + final String ip6Dns1, final String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); final DataCenterVO zone = _dcDao.findById(zoneId); @@ -2724,6 +2728,21 @@ public Network doInTransaction(final TransactionStatus status) { userNetwork.setRouterIpv6(routerIpv6); } + if (!GuestType.L2.equals(userNetwork.getGuestType())) { + if (StringUtils.isNotBlank(dns1)) { + userNetwork.setDns1(dns1); + } + if (StringUtils.isNotBlank(dns2)) { + userNetwork.setDns2(dns2); + } + if (StringUtils.isNotBlank(ip6Dns1)) { + userNetwork.setIp6Dns1(ip6Dns1); + } + if (StringUtils.isNotBlank(ip6Dns2)) { + userNetwork.setIp6Dns2(ip6Dns2); + } + } + if (vlanIdFinal != null) { if (isolatedPvlan == null) { URI uri = null; diff --git a/engine/schema/src/main/java/com/cloud/dc/DataCenterVO.java b/engine/schema/src/main/java/com/cloud/dc/DataCenterVO.java index d0f3192c60c2..038daeaa10b5 100644 --- a/engine/schema/src/main/java/com/cloud/dc/DataCenterVO.java +++ b/engine/schema/src/main/java/com/cloud/dc/DataCenterVO.java @@ -183,15 +183,15 @@ public void setFirewallProvider(String firewallProvider) { this.firewallProvider = firewallProvider; } - public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, + public DataCenterVO(long id, String name, String description, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } - public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, + public DataCenterVO(String name, String description, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { this.name = name; this.description = description; @@ -199,8 +199,8 @@ public DataCenterVO(String name, String description, String dns1, String dns2, S this.dns2 = dns2; this.ip6Dns1 = ip6Dns1; this.ip6Dns2 = ip6Dns2; - this.internalDns1 = dns3; - this.internalDns2 = dns4; + this.internalDns1 = internalDns1; + this.internalDns2 = internalDns2; this.guestNetworkCidr = guestCidr; this.domain = domain; this.domainId = domainId; diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java index 4dbcda670a7a..e6869b4b264b 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java @@ -30,6 +30,7 @@ import javax.persistence.Transient; import org.apache.cloudstack.acl.ControlledEntity; +import org.apache.commons.lang3.StringUtils; import com.cloud.network.Network; import com.cloud.network.Networks.BroadcastDomainType; @@ -106,9 +107,6 @@ public class NetworkVO implements Network { @Column(name = "redundant") boolean redundant; - @Column(name = "dns1") - String dns1; - @Column(name = "domain_id") long domainId; @@ -125,9 +123,18 @@ public class NetworkVO implements Network { @Column(name = "guru_data", length = 1024) String guruData; + @Column(name = "dns1") + String dns1; + @Column(name = "dns2") String dns2; + @Column(name = "ip6Dns1") + String ip6Dns1; + + @Column(name = "ip6Dns2") + String ip6Dns2; + @Column(name = "network_domain") String networkDomain; @@ -255,6 +262,18 @@ public NetworkVO(long id, Network that, long offeringId, String guruName, long d uuid = UUID.randomUUID().toString(); ip6Gateway = that.getIp6Gateway(); ip6Cidr = that.getIp6Cidr(); + if (StringUtils.isNotBlank(that.getDns1())) { + this.dns1 = that.getDns1(); + } + if (StringUtils.isNotBlank(that.getDns2())) { + this.dns2 = that.getDns2(); + } + if (StringUtils.isNotBlank(that.getIp6Dns1())) { + this.ip6Dns1 = that.getIp6Dns1(); + } + if (StringUtils.isNotBlank(that.getIp6Dns2())) { + this.ip6Dns2 = that.getIp6Dns2(); + } this.externalId = externalId; } @@ -471,6 +490,7 @@ public long getDataCenterId() { return dataCenterId; } + @Override public String getDns1() { return dns1; } @@ -479,6 +499,7 @@ public void setDns1(String dns) { dns1 = dns; } + @Override public String getDns2() { return dns2; } @@ -487,6 +508,24 @@ public void setDns2(String dns) { dns2 = dns; } + @Override + public String getIp6Dns1() { + return ip6Dns1; + } + + public void setIp6Dns1(String ip6Dns1) { + this.ip6Dns1 = ip6Dns1; + } + + @Override + public String getIp6Dns2() { + return ip6Dns2; + } + + public void setIp6Dns2(String ip6Dns2) { + this.ip6Dns2 = ip6Dns2; + } + @Override public String getName() { return name; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 6885e4992226..10f2b2cc27ec 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -972,3 +972,8 @@ WHERE not exists( SELECT 1 CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (64-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (32-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); + +-- Alter event table to add resource_id and resource_type +ALTER TABLE `cloud`.`networks` + ADD COLUMN `ip6dns1` varchar(255) DEFAULT NULL COMMENT 'comma separated DNS list' AFTER `dns2`, + ADD COLUMN `ip6dns2` varchar(255) DEFAULT NULL COMMENT 'comma separated DNS list' AFTER `ip6dns1`; diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java index 68acee88abe1..bf6932f05d43 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java @@ -41,6 +41,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; +import com.cloud.network.NetworkModel; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; @@ -49,6 +50,7 @@ import com.cloud.network.dao.IPAddressVO; import com.cloud.network.guru.DirectPodBasedNetworkGuru; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.utils.Pair; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; @@ -74,6 +76,8 @@ public class BaremetaNetworkGuru extends DirectPodBasedNetworkGuru { PodVlanMapDao _podVlanDao; @Inject IpAddressManager _ipAddrMgr; + @Inject + NetworkModel networkModel; @Override public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) @@ -125,8 +129,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) { } DataCenter dc = _dcDao.findById(network.getDataCenterId()); - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); /* * Pod pod = dest.getPod(); Pair ip = @@ -167,7 +172,8 @@ private void getBaremetalIp(NicProfile nic, Pod pod, VirtualMachineProfile vm, N nic.setReservationId(String.valueOf(ip.getVlanTag())); nic.setMacAddress(ip.getMacAddress()); } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 894ea4c49378..384b3a736617 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -16,6 +16,58 @@ // under the License. package com.cloud.kubernetes.cluster; +import static com.cloud.utils.NumbersUtil.toHumanReadableSize; + +import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.acl.ControlledEntity; +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.annotation.AnnotationService; +import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiConstants.VMDetails; +import org.apache.cloudstack.api.ResponseObject.ResponseView; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.CreateKubernetesClusterCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.DeleteKubernetesClusterCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.GetKubernetesClusterConfigCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.ListKubernetesClustersCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.ScaleKubernetesClusterCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.StartKubernetesClusterCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.StopKubernetesClusterCmd; +import org.apache.cloudstack.api.command.user.kubernetes.cluster.UpgradeKubernetesClusterCmd; +import org.apache.cloudstack.api.response.KubernetesClusterConfigResponse; +import org.apache.cloudstack.api.response.KubernetesClusterResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.UserVmResponse; +import org.apache.cloudstack.config.ApiServiceConfiguration; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + import com.cloud.api.ApiDBUtils; import com.cloud.api.query.dao.NetworkOfferingJoinDao; import com.cloud.api.query.dao.TemplateJoinDao; @@ -117,56 +169,6 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; -import org.apache.cloudstack.acl.ControlledEntity; -import org.apache.cloudstack.acl.SecurityChecker; -import org.apache.cloudstack.annotation.AnnotationService; -import org.apache.cloudstack.annotation.dao.AnnotationDao; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ApiConstants.VMDetails; -import org.apache.cloudstack.api.ResponseObject.ResponseView; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.CreateKubernetesClusterCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.DeleteKubernetesClusterCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.GetKubernetesClusterConfigCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.ListKubernetesClustersCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.ScaleKubernetesClusterCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.StartKubernetesClusterCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.StopKubernetesClusterCmd; -import org.apache.cloudstack.api.command.user.kubernetes.cluster.UpgradeKubernetesClusterCmd; -import org.apache.cloudstack.api.response.KubernetesClusterConfigResponse; -import org.apache.cloudstack.api.response.KubernetesClusterResponse; -import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.response.UserVmResponse; -import org.apache.cloudstack.config.ApiServiceConfiguration; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.managed.context.ManagedContextRunnable; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.math.BigInteger; -import java.net.MalformedURLException; -import java.net.URL; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import static com.cloud.utils.NumbersUtil.toHumanReadableSize; public class KubernetesClusterManagerImpl extends ManagerBase implements KubernetesClusterService { @@ -760,7 +762,9 @@ private Network getKubernetesClusterNetworkIfMissing(final String clusterName, f try { network = networkMgr.createGuestNetwork(networkOffering.getId(), clusterName + "-network", owner.getAccountName() + "-network", - null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ControlledEntity.ACLType.Account, null, null, null, null, true, null, null, null, null, null); + null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), + ControlledEntity.ACLType.Account, null, null, null, null, true, null, + null, null, null, null, null, null, null, null); } catch (ConcurrentOperationException | InsufficientCapacityException | ResourceAllocationException e) { logAndThrow(Level.ERROR, String.format("Unable to create network for the Kubernetes cluster: %s", clusterName)); } diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 7ec4d0fd37ef..010925b70062 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -1802,7 +1802,8 @@ public Ternary, Network> doInTransaction(Transa s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of createVlanIpRange process"); guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() - + "-network", null, null, null, false, null, owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, null, null, true, null, null, null, null, null); + + "-network", null, null, null, false, null, owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, null, null, true, null, null, null, null, null, + null, null, null, null); if (guestNetwork == null) { s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " @@ -2210,8 +2211,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff nic.setMacAddress(ip.getMacAddress()); } } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } _ipv6Mgr.setNicIp6Address(nic, dc, network); @@ -2260,8 +2262,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId())); } } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } _ipv6Mgr.setNicIp6Address(nic, dc, network); diff --git a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java index 2a53708fc59b..0d683292cfaa 100644 --- a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java @@ -42,6 +42,7 @@ import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.user.Account; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.DB; import com.cloud.utils.net.NetUtils; @@ -226,8 +227,9 @@ public void setNicIp6Address(final NicProfile nic, final DataCenter dc, final Ne IPv6Address.class.getName(), null); } } - nic.setIPv6Dns1(dc.getIp6Dns1()); - nic.setIPv6Dns2(dc.getIp6Dns2()); + Pair dns = _networkModel.getNetworkIp6Dns(network, dc); + nic.setIPv6Dns1(dns.first()); + nic.setIPv6Dns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java index 6046d4fc0dca..475a3d6dba0f 100644 --- a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java +++ b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java @@ -143,6 +143,8 @@ public class Ipv6ServiceImpl extends ComponentLifecycleBase implements Ipv6Servi FirewallManager firewallManager; @Inject NetworkOrchestrationService networkOrchestrationService; + @Inject + NetworkModel _networkModel; private boolean isPublicIpv6PlaceholderNic(NicVO nic) { return ObjectUtils.allNotNull(nic.getIPv6Address(), nic.getIPv6Cidr(), nic.getIPv6Gateway()) && @@ -447,8 +449,9 @@ public void updateNicIpv6(NicProfile nic, DataCenter dc, Network network) throws } else { nic.setFormat(Networks.AddressFormat.Ip6); } - nic.setIPv6Dns1(dc.getIp6Dns1()); - nic.setIPv6Dns2(dc.getIp6Dns2()); + Pair dns = _networkModel.getNetworkIp6Dns(network, dc); + nic.setIPv6Dns1(dns.first()); + nic.setIPv6Dns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 66d79cc35047..a23aa37e8374 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -79,6 +79,7 @@ import com.cloud.network.dao.NetworkAccountDao; import com.cloud.network.dao.NetworkAccountVO; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.NetworkDomainDao; import com.cloud.network.dao.NetworkDomainVO; import com.cloud.network.dao.NetworkServiceMapDao; @@ -119,6 +120,7 @@ import com.cloud.user.DomainManager; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; +import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.ManagerBase; @@ -166,6 +168,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi @Inject NetworkDao _networksDao = null; @Inject + NetworkDetailsDao networkDetailsDao; + @Inject NicDao _nicDao = null; @Inject PodVlanMapDao _podVlanMapDao; @@ -2637,4 +2641,42 @@ public String getValidNetworkCidr(Network guestNetwork) { String networkCidr = guestNetwork.getNetworkCidr(); return networkCidr == null ? guestNetwork.getCidr() : networkCidr; } + + @Override + public Pair getNetworkIp4Dns(final Network network, final DataCenter zone) { + String dns1 = null; + String dns2 = null; + if (org.apache.commons.lang3.StringUtils.isNotEmpty(network.getDns1())) { + dns1 = network.getDns1(); + if (org.apache.commons.lang3.StringUtils.isNotEmpty(network.getDns2())) { + dns2 = network.getDns2(); + } + } + if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + dns1 = zone.getDns1(); + } + if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + dns2 = zone.getDns2(); + } + return new Pair<>(dns1, dns2); + } + + @Override + public Pair getNetworkIp6Dns(final Network network, final DataCenter zone) { + String dns1 = null; + String dns2 = null; + if (org.apache.commons.lang3.StringUtils.isNotEmpty(network.getIp6Dns1())) { + dns1 = network.getIp6Dns1(); + if (org.apache.commons.lang3.StringUtils.isNotEmpty(network.getIp6Dns2())) { + dns2 = network.getIp6Dns2(); + } + } + if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + dns1 = zone.getIp6Dns1(); + } + if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + dns2 = zone.getIp6Dns2(); + } + return new Pair<>(dns1, dns2); + } } diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index cb6e2a526d65..fe3e1bdfc4b3 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -74,6 +74,7 @@ import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -1254,6 +1255,10 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac String externalId = cmd.getExternalId(); String isolatedPvlanType = cmd.getIsolatedPvlanType(); Long associatedNetworkId = cmd.getAssociatedNetworkId(); + String ip4Dns1 = cmd.getIp4Dns1(); + String ip4Dns2 = cmd.getIp4Dns2(); + String ip6Dns1 = cmd.getIp6Dns1(); + String ip6Dns2 = cmd.getIp6Dns2(); // Validate network offering NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); @@ -1467,7 +1472,7 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!"); } - if(StringUtils.isAllBlank(zone.getIp6Dns1(), zone.getIp6Dns2())) { + if(StringUtils.isAllBlank(ip6Dns1, ip6Dns2, zone.getIp6Dns1(), zone.getIp6Dns2())) { throw new InvalidParameterValueException("Can only create IPv6 network if the zone has IPv6 DNS! Please configure the zone IPv6 DNS1 and/or IPv6 DNS2."); } @@ -1590,9 +1595,25 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac cidr, startIP, endIP); } + if (GuestType.L2.equals(ntwkOff.getGuestType()) && ObjectUtils.anyNotNull(ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2)) { + throw new InvalidParameterValueException(String.format("DNS can not be specified %s networks", GuestType.L2)); + } + + if (!ipv6 && !StringUtils.isAllEmpty(ip6Dns1, ip6Dns2)) { + throw new InvalidParameterValueException("IPv6 DNS cannot be specified for IPv4 only network"); + } + + if (StringUtils.isEmpty(ip4Dns1) && StringUtils.isNotEmpty(ip4Dns2)) { + throw new InvalidParameterValueException("Second IPv4 DNS can be specified only with the first IPv4 DNS"); + } + + if (StringUtils.isEmpty(ip6Dns1) && StringUtils.isNotEmpty(ip6Dns2)) { + throw new InvalidParameterValueException("Second IPv6 DNS can be specified only with the first IPv6 DNS"); + } + Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId, bypassVlanOverlapCheck, name, displayText, caller, physicalNetworkId, zoneId, domainId, isDomainSpecific, subdomainAccess, vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, secondaryVlanId, privateVlanType, ntwkOff, pNtwk, aclType, owner, cidr, createVlan, - externalId, routerIp, routerIpv6, associatedNetwork); + externalId, routerIp, routerIpv6, associatedNetwork, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); if (hideIpAddressUsage) { _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.hideIpAddressUsage, String.valueOf(hideIpAddressUsage), false)); @@ -1734,7 +1755,7 @@ private Network commitNetwork(final Long networkOfferingId, final String gateway final boolean isDomainSpecific, final Boolean subdomainAccessFinal, final Long vpcId, final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Boolean displayNetwork, final Long aclId, final String isolatedPvlan, final PVlanType isolatedPvlanType, final NetworkOfferingVO ntwkOff, final PhysicalNetwork pNtwk, final ACLType aclType, final Account ownerFinal, final String cidr, final boolean createVlan, final String externalId, String routerIp, String routerIpv6, - final Network associatedNetwork) throws InsufficientCapacityException, ResourceAllocationException { + final Network associatedNetwork, final String ip4Dns1, final String ip4Dns2, final String ip6Dns1, final String ip6Dns2) throws InsufficientCapacityException, ResourceAllocationException { try { Network network = Transaction.execute(new TransactionCallbackWithException() { @Override @@ -1803,7 +1824,7 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa } network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, sharedDomainId, pNtwk, - zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId, routerIp, routerIpv6); + zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId, routerIp, routerIpv6, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); } if (createVlan && network != null) { @@ -1814,6 +1835,12 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa if (associatedNetwork != null) { _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.AssociatedNetworkId, String.valueOf(associatedNetwork.getId()), true)); } + if (StringUtils.isNotEmpty(ip6Dns1)) { + _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), ApiConstants.IP6_DNS1, ip6Dns1, true)); + if (StringUtils.isNotEmpty(ip6Dns2)) { + _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), ApiConstants.IP6_DNS2, ip6Dns2, true)); + } + } return network; } }); diff --git a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java index 5629eb2d1c17..2e8fa7b8be22 100644 --- a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java @@ -20,7 +20,6 @@ import javax.inject.Inject; -import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; @@ -36,8 +35,6 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.network.dao.PhysicalNetworkDao; -import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; import com.cloud.network.Network.GuestType; @@ -54,8 +51,12 @@ import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; @@ -240,11 +241,13 @@ public IsolationMethod[] getIsolationMethods() { @Override public void updateNicProfile(NicProfile profile, Network network) { DataCenter dc = _dcDao.findById(network.getDataCenterId()); + Pair ip4Dns = _networkModel.getNetworkIp4Dns(network, dc); + Pair ip6Dns = _networkModel.getNetworkIp6Dns(network, dc); if (profile != null) { - profile.setIPv4Dns1(dc.getDns1()); - profile.setIPv4Dns2(dc.getDns2()); - profile.setIPv6Dns1(dc.getIp6Dns1()); - profile.setIPv6Dns2(dc.getIp6Dns2()); + profile.setIPv4Dns1(ip4Dns.first()); + profile.setIPv4Dns2(ip4Dns.second()); + profile.setIPv6Dns1(ip6Dns.first()); + profile.setIPv6Dns2(ip6Dns.second()); } } @@ -413,7 +416,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) { @Override public void updateNetworkProfile(NetworkProfile networkProfile) { DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); - networkProfile.setDns1(dc.getDns1()); - networkProfile.setDns2(dc.getDns2()); + Network network = _networkModel.getNetwork(networkProfile.getId()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + networkProfile.setDns1(dns.first()); + networkProfile.setDns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/DirectPodBasedNetworkGuru.java index 01b33893b5c5..f0ddc128b956 100644 --- a/server/src/main/java/com/cloud/network/guru/DirectPodBasedNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/DirectPodBasedNetworkGuru.java @@ -50,6 +50,7 @@ import com.cloud.network.dao.IPAddressVO; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; @@ -157,8 +158,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) { } DataCenter dc = _dcDao.findById(network.getDataCenterId()); - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } @DB @@ -240,8 +242,9 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff } }); - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 6524abe1e455..2f7051154c84 100644 --- a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -59,6 +59,7 @@ import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; @@ -321,8 +322,9 @@ public void reserve(NicProfile nic, Network config, VirtualMachineProfile vm, De if (_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId())) { nic.setBroadcastUri(config.getBroadcastUri()); nic.setIsolationUri(config.getBroadcastUri()); - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(config, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); nic.setIPv4Netmask(NetUtils.cidr2Netmask(config.getCidr())); long cidrAddress = NetUtils.ip2Long(config.getCidr().split("/")[0]); int cidrSize = getGloballyConfiguredCidrSize(); diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java index be3d57eb48d4..01e541b4dd04 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -28,6 +28,7 @@ import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.configuration.Config; @@ -258,6 +259,13 @@ public Network design(final NetworkOffering offering, final DeploymentPlan plan, network.setPvlanType(userSpecified.getPvlanType()); } } + + if (StringUtils.isNotBlank(userSpecified.getDns1())) { + network.setDns1(userSpecified.getDns1()); + } + if (StringUtils.isNotBlank(userSpecified.getDns2())) { + network.setDns2(userSpecified.getDns2()); + } } else { final String guestNetworkCidr = dc.getGuestNetworkCidr(); if (guestNetworkCidr == null && dc.getNetworkType() == NetworkType.Advanced) { @@ -437,8 +445,9 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM nic.setIPv4Netmask(NetUtils.cidr2Netmask(_networkModel.getValidNetworkCidr(network))); } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); nic.setFormat(AddressFormat.Ip4); } } @@ -458,9 +467,10 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM @Override public void updateNicProfile(final NicProfile profile, final Network network) { final DataCenter dc = _dcDao.findById(network.getDataCenterId()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); if (profile != null) { - profile.setIPv4Dns1(dc.getDns1()); - profile.setIPv4Dns2(dc.getDns2()); + profile.setIPv4Dns1(dns.first()); + profile.setIPv4Dns2(dns.second()); } } @@ -506,8 +516,10 @@ public boolean trash(final Network network, final NetworkOffering offering) { @Override public void updateNetworkProfile(final NetworkProfile networkProfile) { final DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); - networkProfile.setDns1(dc.getDns1()); - networkProfile.setDns2(dc.getDns2()); + Network network = _networkModel.getNetwork(networkProfile.getId()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + networkProfile.setDns1(dns.first()); + networkProfile.setDns2(dns.second()); } @Override diff --git a/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java index 6e2f1db5f27a..a143d0f0af22 100644 --- a/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java @@ -44,6 +44,7 @@ import com.cloud.network.vpc.dao.PrivateIpDao; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; @@ -60,7 +61,7 @@ public class PrivateNetworkGuru extends AdapterBase implements NetworkGuru { @Inject protected PrivateIpDao _privateIpDao; @Inject - protected NetworkModel _networkMgr; + protected NetworkModel _networkModel; @Inject EntityManager _entityMgr; @@ -199,16 +200,19 @@ protected void getIp(NicProfile nic, DataCenter dc, Network network) throws Insu nic.setMacAddress(ip.getMacAddress()); } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); } @Override public void updateNicProfile(NicProfile profile, Network network) { DataCenter dc = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); if (profile != null) { - profile.setIPv4Dns1(dc.getDns1()); - profile.setIPv4Dns2(dc.getDns2()); + profile.setIPv4Dns1(dns.first()); + profile.setIPv4Dns2(dns.second()); } } @@ -239,7 +243,9 @@ public boolean trash(Network network, NetworkOffering offering) { @Override public void updateNetworkProfile(NetworkProfile networkProfile) { DataCenter dc = _entityMgr.findById(DataCenter.class, networkProfile.getDataCenterId()); - networkProfile.setDns1(dc.getDns1()); - networkProfile.setDns2(dc.getDns2()); + Network network = _networkModel.getNetwork(networkProfile.getId()); + Pair dns = _networkModel.getNetworkIp4Dns(network, dc); + networkProfile.setDns1(dns.first()); + networkProfile.setDns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/PublicNetworkGuru.java index c3f7ee3d9416..e537f93ec667 100644 --- a/server/src/main/java/com/cloud/network/guru/PublicNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/PublicNetworkGuru.java @@ -34,6 +34,7 @@ import com.cloud.network.Ipv6Service; import com.cloud.network.Network; import com.cloud.network.Network.State; +import com.cloud.network.NetworkModel; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; @@ -46,6 +47,7 @@ import com.cloud.network.dao.NetworkVO; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; @@ -73,6 +75,8 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { IpAddressManager _ipAddrMgr; @Inject Ipv6Service ipv6Service; + @Inject + NetworkModel networkModel; private static final TrafficType[] TrafficTypes = {TrafficType.Public}; @@ -140,8 +144,9 @@ protected void getIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Ne nic.setMacAddress(ip.getMacAddress()); } - nic.setIPv4Dns1(dc.getDns1()); - nic.setIPv4Dns2(dc.getDns2()); + Pair dns = networkModel.getNetworkIp4Dns(network, dc); + nic.setIPv4Dns1(dns.first()); + nic.setIPv4Dns2(dns.second()); ipv6Service.updateNicIpv6(nic, dc, network); } @@ -149,9 +154,10 @@ protected void getIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Ne @Override public void updateNicProfile(NicProfile profile, Network network) { DataCenter dc = _dcDao.findById(network.getDataCenterId()); + Pair dns = networkModel.getNetworkIp4Dns(network, dc); if (profile != null) { - profile.setIPv4Dns1(dc.getDns1()); - profile.setIPv4Dns2(dc.getDns2()); + profile.setIPv4Dns1(dns.first()); + profile.setIPv4Dns2(dns.second()); } } @@ -237,8 +243,10 @@ public boolean trash(Network network, NetworkOffering offering) { @Override public void updateNetworkProfile(NetworkProfile networkProfile) { DataCenter dc = _dcDao.findById(networkProfile.getDataCenterId()); - networkProfile.setDns1(dc.getDns1()); - networkProfile.setDns2(dc.getDns2()); + Network network = networkModel.getNetwork(networkProfile.getId()); + Pair dns = networkModel.getNetworkIp4Dns(network, dc); + networkProfile.setDns1(dns.first()); + networkProfile.setDns2(dns.second()); } } diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 8a4e0b85f662..ceb595264631 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -1115,18 +1115,17 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute if (setupDns) { final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); - if (guestNic.getIPv4Dns1() != null) { - defaultDns1 = guestNic.getIPv4Dns1(); - } else { - defaultDns1 = dcVo.getDns1(); + Pair dns = null; + if (org.apache.commons.lang3.StringUtils.isAnyBlank(guestNic.getIPv4Dns1(), guestNic.getIPv4Dns2())) { + dns = _networkModel.getNetworkIp4Dns(network, dcVo); } - if (guestNic.getIPv4Dns2() != null) { - defaultDns2 = guestNic.getIPv4Dns2(); - } else { - defaultDns2 = dcVo.getDns2(); + defaultDns1 = org.apache.commons.lang3.StringUtils.firstNonBlank(guestNic.getIPv4Dns1(), dns.first()); + defaultDns2 = org.apache.commons.lang3.StringUtils.firstNonBlank(guestNic.getIPv4Dns2(), dns.second()); + if (org.apache.commons.lang3.StringUtils.isAnyBlank(guestNic.getIPv6Dns1(), guestNic.getIPv6Dns2())) { + dns = _networkModel.getNetworkIp6Dns(network, dcVo); } - defaultIp6Dns1 = dcVo.getIp6Dns1(); - defaultIp6Dns2 = dcVo.getIp6Dns2(); + defaultIp6Dns1 = org.apache.commons.lang3.StringUtils.firstNonBlank(guestNic.getIPv6Dns1(), dns.first()); + defaultIp6Dns2 = org.apache.commons.lang3.StringUtils.firstNonBlank(guestNic.getIPv6Dns2(), dns.second()); } final Nic nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId()); diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 5ce43629087d..6f3a296c3e0b 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1984,8 +1984,13 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile buf.append(" gateway=").append(nic.getIPv4Gateway()); } if (ipv6) { - defaultIp6Dns1 = nic.getIPv6Dns1() != null? nic.getIPv6Dns1() : dc.getIp6Dns1(); - defaultIp6Dns2 = nic.getIPv6Dns2() != null? nic.getIPv6Dns2() : dc.getIp6Dns2(); + Pair dns = null; + if (StringUtils.isAnyBlank(nic.getIPv6Dns1(), nic.getIPv6Dns2())) { + Network network = _networkModel.getNetwork(nic.getNetworkId()); + dns = _networkModel.getNetworkIp6Dns(network, dc); + } + defaultIp6Dns1 = StringUtils.firstNonBlank(nic.getIPv6Dns1(), dns.first()); + defaultIp6Dns2 = StringUtils.firstNonBlank(nic.getIPv6Dns2(), dns.second()); buf.append(" ip6gateway=").append(nic.getIPv6Gateway()); } defaultDns1 = nic.getIPv4Dns1(); diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 781ee38c8a40..103e73bc4176 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -2712,7 +2712,7 @@ public Network createVpcGuestNetwork(final long ntwkOffId, final String name, fi // 2) Create network final Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId, false, networkDomain, owner, domainId, pNtwk, zoneId, aclType, - subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null); + subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null, null, null, null, null); if (guestNetwork != null) { guestNetwork.setNetworkACLId(aclId); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 9e3622886e94..f0667fc192b3 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3730,7 +3730,7 @@ private NetworkVO createDefaultNetworkForAccount(DataCenter zone, Account owner, s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of deployVM process"); Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null, true, null, null, - null, null, null); + null, null, null, null, null, null, null); if (newNetwork != null) { defaultNetwork = _networkDao.findById(newNetwork.getId()); } @@ -7234,7 +7234,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) { Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), newAccount.getAccountName() + "-network", newAccount.getAccountName() + "-network", null, null, null, false, null, newAccount, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, - null, null, true, null, null, null, null, null); + null, null, true, null, null, null, null, null, null, null, null, null); // if the network offering has persistent set to true, implement the network if (requiredOfferings.get(0).isPersistent()) { DeployDestination dest = new DeployDestination(zone, null, null, null); diff --git a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java index 7a0ea2e97218..93a1d30d1789 100644 --- a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java +++ b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java @@ -129,7 +129,7 @@ public void setup() throws Exception { ACLType.Account, false, 1L, false); when(networkService._networkMgr.createGuestNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), nullable(String.class), nullable(Boolean.class), nullable(String.class), eq(account), nullable(Long.class), eq(physicalNetwork), eq(physicalNetwork.getDataCenterId()), eq(ACLType.Account), nullable(Boolean.class), eq(1L), nullable(String.class), nullable(String.class), - nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class), nullable(String.class), nullable(String.class))).thenReturn(net); + nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class), nullable(String.class), nullable(String.class), nullable(String.class), nullable(String.class), nullable(String.class), nullable(String.class))).thenReturn(net); when( networkService._networkMgr.createPrivateNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), anyString(), anyBoolean(), eq(account), eq(physicalNetwork), eq(1L))).thenReturn(net); diff --git a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java index bd1484d588a3..17676956a82b 100644 --- a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java +++ b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java @@ -19,8 +19,6 @@ import static org.mockito.Mockito.mock; -import com.cloud.dc.DataCenter; -import com.cloud.vm.NicProfile; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -28,6 +26,7 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import com.cloud.dc.DataCenter; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.IpAddress.State; @@ -36,7 +35,9 @@ import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.UserIpv6AddressDaoImpl; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.NicProfile; import com.cloud.vm.dao.NicSecondaryIpDaoImpl; import com.cloud.vm.dao.NicSecondaryIpVO; @@ -239,8 +240,7 @@ public void setNICIPv6AddressTest() throws InsufficientAddressCapacityException Mockito.when(network.getIp6Cidr()).thenReturn("2001:db8:100::/64"); Mockito.when(network.getIp6Gateway()).thenReturn("2001:db8:100::1"); - Mockito.when(dc.getIp6Dns1()).thenReturn("2001:db8::53:1"); - Mockito.when(dc.getIp6Dns1()).thenReturn("2001:db8::53:2"); + Mockito.when(networkModel.getNetworkIp6Dns(network, dc)).thenReturn(new Pair<>("2001:db8::53:1", "2001:db8::53:2")); String expected = "2001:db8:100:0:1c00:b1ff:fe00:af6"; diff --git a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java index e9c9db3cba22..9d452236f953 100644 --- a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java +++ b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java @@ -24,6 +24,7 @@ import javax.naming.ConfigurationException; +import com.cloud.dc.DataCenter; import com.cloud.dc.Vlan; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; @@ -44,6 +45,7 @@ import com.cloud.offering.NetworkOffering.Detail; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; @@ -918,4 +920,13 @@ public String getValidNetworkCidr(Network guestNetwork) { return null; } + @Override + public Pair getNetworkIp4Dns(Network network, DataCenter zone) { + return new Pair<>(null, null); + } + + @Override + public Pair getNetworkIp6Dns(Network network, DataCenter zone) { + return new Pair<>(null, null); + } } diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index 09f00b7925fd..f8effaddb494 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -663,8 +663,8 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n @Override public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6, - String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, - ResourceAllocationException { + String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6, + String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // TODO Auto-generated method stub return null; } diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java index 83ffa0347618..b7d8e565e2fd 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.dc.DataCenter; import com.cloud.dc.Vlan; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; @@ -52,6 +53,7 @@ import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; @@ -933,4 +935,14 @@ public String getValidNetworkCidr(Network guestNetwork) { return null; } + @Override + public Pair getNetworkIp4Dns(Network network, DataCenter zone) { + return new Pair<>(null, null); + } + + @Override + public Pair getNetworkIp6Dns(Network network, DataCenter zone) { + return new Pair<>(null, null); + } + } diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 90df22be8a76..7d0d21ba74c4 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -183,6 +183,52 @@ v-model:value="form.endipv4" :placeholder="apiParams.endip.description"/> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
service.name === 'Dns') + return dnsServices && dnsServices.length === 1 + } + return false + } + }, methods: { initForm () { this.formRef = ref() @@ -458,29 +514,11 @@ export default { displayText: values.displaytext, networkOfferingId: this.selectedNetworkOffering.id } - if (this.isValidTextValueForKey(values, 'gateway')) { - params.gateway = values.gateway - } - if (this.isValidTextValueForKey(values, 'netmask')) { - params.netmask = values.netmask - } - if (this.isValidTextValueForKey(values, 'startipv4')) { - params.startip = values.startipv4 - } - if (this.isValidTextValueForKey(values, 'endipv4')) { - params.endip = values.endipv4 - } - if (this.isValidTextValueForKey(values, 'externalid')) { - params.externalid = values.externalid - } - if (this.isValidTextValueForKey(values, 'vpcid')) { - params.vpcid = this.selectedVpc.id - } - if (this.isValidTextValueForKey(values, 'vlanid')) { - params.vlan = values.vlanid - } - if (this.isValidTextValueForKey(values, 'networkdomain')) { - params.networkdomain = values.networkdomain + var usefulFields = ['gateway', 'netmask', 'startipv4', 'endipv4', 'dns1', 'dns2', 'ip6dns1', 'ip6dns2', 'externalid', 'vpcid', 'vlanid', 'networkdomain'] + for (var field of usefulFields) { + if (this.isValidTextValueForKey(values, field)) { + params[field] = values[field] + } } if ('domainid' in values && values.domainid > 0) { params.domainid = this.selectedDomain.id From 78ca1c8440fe50f644c1cd294a77454c4ad4efdc Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 2 Jun 2022 17:28:25 +0530 Subject: [PATCH 02/26] wip Signed-off-by: Abhishek Kumar --- .../service/NetworkOrchestrationService.java | 2 +- .../com/cloud/network/vpc/VpcManager.java | 3 +- .../orchestration/NetworkOrchestrator.java | 52 +++- .../com/cloud/network/NetworkModelImpl.java | 4 +- .../com/cloud/network/NetworkServiceImpl.java | 8 +- .../cloud/network/guru/GuestNetworkGuru.java | 6 + .../VirtualNetworkApplianceManagerImpl.java | 9 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 4 +- .../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +- .../views/network/CreateSharedNetworkForm.vue | 242 ++++++++++++------ 10 files changed, 222 insertions(+), 110 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index 4fafe274aee0..cde00df026e7 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -188,7 +188,7 @@ void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationC Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6, - String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; + String ip4Dns1, String ip4Dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; UserDataServiceProvider getPasswordResetProvider(Network network); diff --git a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java index 56e70ca56f1f..4974345d4e23 100644 --- a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java @@ -109,8 +109,7 @@ public interface VpcManager { Network createVpcGuestNetwork(long ntwkOffId, String name, String displayText, String gateway, String cidr, String vlanId, String networkDomain, Account owner, Long domainId, PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, long vpcId, Long aclId, Account caller, - Boolean displayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr) - + Boolean displayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr, String ip4Dns1, String ip4Dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; /** diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 8a3007fe938f..cda9b26f1e61 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -1892,6 +1892,31 @@ public NicProfile prepareNic(final VirtualMachineProfile vmProfile, final Deploy final NicVO nic = _nicDao.findById(nicId); NicProfile profile = null; + String defaultIp4Dns1 = null; + String defaultIp4Dns2 = null; + String defaultIp6Dns1 = null; + String defaultIp6Dns2 = null; + if (Type.DomainRouter.equals(vmProfile.getType())) { + List networkIds = routerNetworkDao.getRouterNetworks(vmProfile.getId()); + for (Long networkId : networkIds) { + NetworkVO routerNetwork = _networksDao.findById(networkId); + if (StringUtils.isNotBlank(routerNetwork.getDns1())) { + defaultIp4Dns1 = routerNetwork.getDns1(); + } + if (StringUtils.isNotBlank(routerNetwork.getDns2())) { + defaultIp4Dns2 = routerNetwork.getDns2(); + } + if (StringUtils.isNotBlank(routerNetwork.getIp6Dns1())) { + defaultIp6Dns1 = routerNetwork.getIp6Dns1(); + } + if (StringUtils.isNotBlank(routerNetwork.getIp6Dns2())) { + defaultIp6Dns2 = routerNetwork.getIp6Dns2(); + } + if (!StringUtils.isAllBlank(defaultIp4Dns1, defaultIp4Dns2, defaultIp6Dns1, defaultIp6Dns2)) { + break; + } + } + } if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) { nic.setState(Nic.State.Reserving); nic.setReservationId(context.getReservationId()); @@ -1951,7 +1976,18 @@ public NicProfile prepareNic(final VirtualMachineProfile vmProfile, final Deploy profile.setSecurityGroupEnabled(_networkModel.isSecurityGroupSupportedInNetwork(network)); guru.updateNicProfile(profile, network); - + if (StringUtils.isNotBlank(defaultIp4Dns1)) { + profile.setIPv4Dns1(defaultIp4Dns1); + } + if (StringUtils.isNotBlank(defaultIp4Dns2)) { + profile.setIPv4Dns2(defaultIp4Dns2); + } + if (StringUtils.isNotBlank(defaultIp6Dns1)) { + profile.setIPv6Dns1(defaultIp6Dns1); + } + if (StringUtils.isNotBlank(defaultIp6Dns2)) { + profile.setIPv6Dns2(defaultIp6Dns2); + } configureExtraDhcpOptions(network, nicId); return profile; } @@ -2440,11 +2476,11 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, - String routerIp, String routerIpv6, String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + String routerIp, String routerIpv6, String ip4Dns1, String ip4Dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // create Isolated/Shared/L2 network return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, - isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6, dns1, dns2, ip6Dns1, ip6Dns2); + isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); } @DB @@ -2452,7 +2488,7 @@ private Network createGuestNetwork(final long networkOfferingId, final String na boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, - final Boolean isPrivateNetwork, String routerIp, String routerIpv6, final String dns1, final String dns2, + final Boolean isPrivateNetwork, String routerIp, String routerIpv6, final String ip4Dns1, final String ip4Dns2, final String ip6Dns1, final String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); @@ -2729,11 +2765,11 @@ public Network doInTransaction(final TransactionStatus status) { } if (!GuestType.L2.equals(userNetwork.getGuestType())) { - if (StringUtils.isNotBlank(dns1)) { - userNetwork.setDns1(dns1); + if (StringUtils.isNotBlank(ip4Dns1)) { + userNetwork.setDns1(ip4Dns1); } - if (StringUtils.isNotBlank(dns2)) { - userNetwork.setDns2(dns2); + if (StringUtils.isNotBlank(ip4Dns2)) { + userNetwork.setDns2(ip4Dns2); } if (StringUtils.isNotBlank(ip6Dns1)) { userNetwork.setIp6Dns1(ip6Dns1); diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index a23aa37e8374..db48d4c453b2 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -2655,7 +2655,7 @@ public Pair getNetworkIp4Dns(final Network network, final DataCe if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { dns1 = zone.getDns1(); } - if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + if (org.apache.commons.lang3.StringUtils.isEmpty(dns2)) { dns2 = zone.getDns2(); } return new Pair<>(dns1, dns2); @@ -2674,7 +2674,7 @@ public Pair getNetworkIp6Dns(final Network network, final DataCe if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { dns1 = zone.getIp6Dns1(); } - if (org.apache.commons.lang3.StringUtils.isEmpty(dns1)) { + if (org.apache.commons.lang3.StringUtils.isEmpty(dns2)) { dns2 = zone.getIp6Dns2(); } return new Pair<>(dns1, dns2); diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index fe3e1bdfc4b3..27eb4f4d5e1f 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1814,7 +1814,7 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa } } network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, - subdomainAccess, vpcId, aclId, caller, displayNetwork, externalId, ip6Gateway, ip6Cidr); + subdomainAccess, vpcId, aclId, caller, displayNetwork, externalId, ip6Gateway, ip6Cidr, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); } else { if (_configMgr.isOfferingForVpc(ntwkOff)) { throw new InvalidParameterValueException("Network offering can be used for VPC networks only"); @@ -1835,12 +1835,6 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa if (associatedNetwork != null) { _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.AssociatedNetworkId, String.valueOf(associatedNetwork.getId()), true)); } - if (StringUtils.isNotEmpty(ip6Dns1)) { - _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), ApiConstants.IP6_DNS1, ip6Dns1, true)); - if (StringUtils.isNotEmpty(ip6Dns2)) { - _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), ApiConstants.IP6_DNS2, ip6Dns2, true)); - } - } return network; } }); diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java index 01e541b4dd04..8d1ae2b44186 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -266,6 +266,12 @@ public Network design(final NetworkOffering offering, final DeploymentPlan plan, if (StringUtils.isNotBlank(userSpecified.getDns2())) { network.setDns2(userSpecified.getDns2()); } + if (StringUtils.isNotBlank(userSpecified.getIp6Dns1())) { + network.setIp6Dns1(userSpecified.getIp6Dns1()); + } + if (StringUtils.isNotBlank(userSpecified.getIp6Dns2())) { + network.setIp6Dns2(userSpecified.getIp6Dns2()); + } } else { final String guestNetworkCidr = dc.getGuestNetworkCidr(); if (guestNetworkCidr == null && dc.getNetworkType() == NetworkType.Advanced) { diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 6f3a296c3e0b..c8daff60ba81 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1984,13 +1984,8 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile buf.append(" gateway=").append(nic.getIPv4Gateway()); } if (ipv6) { - Pair dns = null; - if (StringUtils.isAnyBlank(nic.getIPv6Dns1(), nic.getIPv6Dns2())) { - Network network = _networkModel.getNetwork(nic.getNetworkId()); - dns = _networkModel.getNetworkIp6Dns(network, dc); - } - defaultIp6Dns1 = StringUtils.firstNonBlank(nic.getIPv6Dns1(), dns.first()); - defaultIp6Dns2 = StringUtils.firstNonBlank(nic.getIPv6Dns2(), dns.second()); + defaultIp6Dns1 = nic.getIPv6Dns1(); + defaultIp6Dns2 = nic.getIPv6Dns2(); buf.append(" ip6gateway=").append(nic.getIPv6Gateway()); } defaultDns1 = nic.getIPv4Dns1(); diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 103e73bc4176..7ef052100d06 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -2687,7 +2687,7 @@ public boolean isIpAllocatedToVpc(final IpAddress ip) { @Override public Network createVpcGuestNetwork(final long ntwkOffId, final String name, final String displayText, final String gateway, final String cidr, final String vlanId, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, final Boolean subdomainAccess, - final long vpcId, final Long aclId, final Account caller, final Boolean isDisplayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr) throws ConcurrentOperationException, InsufficientCapacityException, + final long vpcId, final Long aclId, final Account caller, final Boolean isDisplayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr, final String ip4Dns1, final String ip4Dns2, final String ip6Dns1, final String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final Vpc vpc = getActiveVpc(vpcId); @@ -2712,7 +2712,7 @@ public Network createVpcGuestNetwork(final long ntwkOffId, final String name, fi // 2) Create network final Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId, false, networkDomain, owner, domainId, pNtwk, zoneId, aclType, - subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null, null, null, null, null); + subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null, ip4Dns1, ip4Dns2, ip6Dns1, ip6Dns2); if (guestNetwork != null) { guestNetwork.setNetworkACLId(aclId); diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index f8effaddb494..4398b13710d1 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -664,7 +664,7 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6, String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6, - String dns1, String dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + String ip4Dns1, String ip4Dns2, String ip6Dns1, String ip6Dns2) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // TODO Auto-generated method stub return null; } diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue index fdcb890fd07b..4c522afa825e 100644 --- a/ui/src/views/network/CreateSharedNetworkForm.vue +++ b/ui/src/views/network/CreateSharedNetworkForm.vue @@ -265,86 +265,158 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +