diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java index 00e9cec90d8..26532354720 100755 --- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java @@ -42,16 +42,6 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.gpu.dao.VgpuProfileDao; -import com.cloud.offering.ServiceOffering; -import com.cloud.service.ServiceOfferingDetailsVO; -import com.cloud.storage.ScopeType; -import com.cloud.storage.StoragePoolAndAccessGroupMapVO; -import com.cloud.storage.dao.StoragePoolAndAccessGroupMapDao; -import com.cloud.storage.dao.StoragePoolTagsDao; -import com.cloud.gpu.GpuCardVO; -import com.cloud.gpu.VgpuProfileVO; -import com.cloud.gpu.dao.GpuCardDao; import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; @@ -154,10 +144,14 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageConflictException; import com.cloud.exception.StorageUnavailableException; import com.cloud.gpu.GPU; +import com.cloud.gpu.GpuCardVO; import com.cloud.gpu.HostGpuGroupsVO; import com.cloud.gpu.VGPUTypesVO; +import com.cloud.gpu.VgpuProfileVO; +import com.cloud.gpu.dao.GpuCardDao; import com.cloud.gpu.dao.HostGpuGroupsDao; import com.cloud.gpu.dao.VGPUTypesDao; +import com.cloud.gpu.dao.VgpuProfileDao; import com.cloud.ha.HighAvailabilityManager; import com.cloud.ha.HighAvailabilityManager.WorkType; import com.cloud.ha.HighAvailabilityManagerImpl; @@ -178,17 +172,21 @@ import com.cloud.hypervisor.HypervisorGuru; import com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; +import com.cloud.offering.ServiceOffering; import com.cloud.org.Cluster; import com.cloud.org.Grouping; import com.cloud.org.Managed; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementService; +import com.cloud.service.ServiceOfferingDetailsVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.storage.ScopeType; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolAndAccessGroupMapVO; import com.cloud.storage.StoragePoolHostVO; import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.StorageService; @@ -196,7 +194,9 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.StoragePoolAndAccessGroupMapDao; import com.cloud.storage.dao.StoragePoolHostDao; +import com.cloud.storage.dao.StoragePoolTagsDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; @@ -719,6 +719,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, String hypervisorType = cmd.getHypervisor().equalsIgnoreCase(HypervisorGuru.HypervisorCustomDisplayName.value()) ? "Custom" : cmd.getHypervisor(); + checkForDuplicateHost(url); return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, hypervisorType, hostTags, storageAccessGroups, cmd.getFullUrlParams(), false, cmd.getExternalDetails()); } @@ -3523,6 +3524,32 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return host; } + void checkForDuplicateHost(final String url) { + String hostIpOrName = null; + String ipAddress = null; + try { + hostIpOrName = new URI(UriUtils.encodeURIComponent(url)).getHost(); + if (StringUtils.isBlank(hostIpOrName)) { + return; + } + InetAddress ip = InetAddress.getByName(hostIpOrName); + ipAddress = ip.getHostAddress(); + } catch (final URISyntaxException | UnknownHostException ignore) { + // unparseable URL or unknown host - discoverer will reject it shortly anyway + return; + } + + if (StringUtils.isNotBlank(ipAddress)) { + final HostVO existingByIp = _hostDao.findByIp(ipAddress); + // findByIp matches hosts of any type; only a Routing host is a duplicate for addHost + if (existingByIp != null && Host.Type.Routing.equals(existingByIp.getType())) { + throw new InvalidParameterValueException(String.format( + "A host with IP address '%s' (%s) already exists (id: %s). Remove it before adding again.", + ipAddress, hostIpOrName, existingByIp.getUuid())); + } + } + } + private Host createHostAndAgentDeferred(final ServerResource resource, final Map details, final boolean old, final List hostTags, List storageAccessGroups, final boolean forRebalance) { HostVO host = null; StartupCommand[] cmds = null; diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java index 39870ebaafd..13c47e83bfc 100755 --- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java @@ -322,6 +322,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, private SecondaryStorageHeuristicDao secondaryStorageHeuristicDao; @Inject private HeuristicRuleHelper heuristicRuleHelper; + @Inject + private UserDataDao userDataDao; private List _adapters; @@ -329,12 +331,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, protected boolean backupSnapshotAfterTakingSnapshot = SnapshotInfo.BackupSnapshotAfterTakingSnapshot.value(); - @Inject - private UserDataDao userDataDao; - - @Inject - private UserDataDao userDataDao; - private TemplateAdapter getAdapter(HypervisorType type) { TemplateAdapter adapter = null; if (type == HypervisorType.BareMetal) { diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index a09b8b329f4..b4c23beaef2 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -42,8 +42,8 @@ import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.cloudstack.acl.APIChecker; import org.apache.cloudstack.acl.APIAclChecker; +import org.apache.cloudstack.acl.APIChecker; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.InfrastructureEntity; import org.apache.cloudstack.acl.QuerySelector; @@ -176,10 +176,9 @@ import com.cloud.user.dao.UserDataDao; import com.cloud.utils.ConstantTimeComparator; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.Ternary; -import com.cloud.utils.UuidUtils; import com.cloud.utils.StringUtils; import com.cloud.utils.Ternary; +import com.cloud.utils.UuidUtils; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase;