From 40934ba9ff1b84e5dde559deabb4bc8e56193ce0 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Thu, 27 Aug 2020 12:53:06 +0530 Subject: [PATCH] Fix travis failures by removing dependency of vmware from storage. Added a new command class to verify the vCenter details provided while adding primary storage --- .../api/ValidateVcenterDetailsCommand.java | 40 +++++++++++++++++ .../vmware/resource/VmwareResource.java | 17 ++++++++ plugins/storage/volume/default/pom.xml | 6 --- ...oudStackPrimaryDataStoreLifeCycleImpl.java | 43 +++++++++++-------- 4 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java diff --git a/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java b/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java new file mode 100644 index 00000000000..d1d1393efe4 --- /dev/null +++ b/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java @@ -0,0 +1,40 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.agent.api; + +public class ValidateVcenterDetailsCommand extends Command { + + String vCenterServerAddress; + + public ValidateVcenterDetailsCommand(String vCenterServerAddress) { + this.vCenterServerAddress = vCenterServerAddress; + } + + public String getvCenterServerAddress() { + return vCenterServerAddress; + } + + public void setvCenterServerAddress(String vCenterServerAddress) { + this.vCenterServerAddress = vCenterServerAddress; + } + + @Override + public boolean executeInSequence() { + return false; + } +} diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index bab45bf492b..eb9f333ec7a 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.hypervisor.vmware.resource; +import com.cloud.agent.api.ValidateVcenterDetailsCommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.storage.configdrive.ConfigDrive; import org.apache.cloudstack.storage.to.TemplateObjectTO; @@ -569,6 +570,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa answer = execute((GetUnmanagedInstancesCommand) cmd); } else if (clz == PrepareUnmanageVMInstanceCommand.class) { answer = execute((PrepareUnmanageVMInstanceCommand) cmd); + } else if (clz == ValidateVcenterDetailsCommand.class) { + answer = execute((ValidateVcenterDetailsCommand) cmd); } else { answer = Answer.createUnsupportedCommandAnswer(cmd); } @@ -7261,4 +7264,18 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return new PrepareUnmanageVMInstanceAnswer(cmd, true, "OK"); } + + private Answer execute(ValidateVcenterDetailsCommand cmd) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Executing resource ValidateVcenterDetailsCommand " + _gson.toJson(cmd)); + } + String vCenterServerAddress = cmd.getvCenterServerAddress(); + VmwareContext context = getServiceContext(); + + if (vCenterServerAddress.equals(context.getServerAddress())) { + return new Answer(cmd, true, "success"); + } else { + return new Answer(cmd, false, "Provided vCenter server address is invalid"); + } + } } diff --git a/plugins/storage/volume/default/pom.xml b/plugins/storage/volume/default/pom.xml index 014e7555d8c..51450e0f8a8 100644 --- a/plugins/storage/volume/default/pom.xml +++ b/plugins/storage/volume/default/pom.xml @@ -33,12 +33,6 @@ cloud-engine-storage-volume ${project.version} - - org.apache.cloudstack - cloud-plugin-hypervisor-vmware - ${project.version} - compile - diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index 4195b4a72a3..068b26fe70a 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -23,6 +23,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.CreateStoragePoolCommand; import com.cloud.agent.api.DeleteStoragePoolCommand; import com.cloud.agent.api.StoragePoolInfo; +import com.cloud.agent.api.ValidateVcenterDetailsCommand; import com.cloud.alert.AlertManager; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.StorageConflictException; @@ -30,10 +31,6 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.hypervisor.vmware.VmwareDatacenterVO; -import com.cloud.hypervisor.vmware.VmwareDatacenterZoneMapVO; -import com.cloud.hypervisor.vmware.dao.VmwareDatacenterDao; -import com.cloud.hypervisor.vmware.dao.VmwareDatacenterZoneMapDao; import com.cloud.resource.ResourceManager; import com.cloud.server.ManagementServer; import com.cloud.storage.OCFS2Manager; @@ -126,10 +123,6 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore StoragePoolAutomation storagePoolAutmation; @Inject protected HostDao _hostDao; - @Inject - private VmwareDatacenterZoneMapDao vmwareDatacenterZoneMapDao; - @Inject - private VmwareDatacenterDao vmwareDcDao; @SuppressWarnings("unchecked") @Override @@ -258,7 +251,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore parameters.setUserInfo(userInfo); } else if (scheme.equalsIgnoreCase("PreSetup")) { if (StringUtils.isNotBlank(hypervisorType) && HypervisorType.getType(hypervisorType).equals(HypervisorType.VMware)) { - validateVcenterDetails(zoneId, storageHost); + validateVcenterDetails(zoneId, podId, clusterId,storageHost); } parameters.setType(StoragePoolType.PreSetup); parameters.setHost(storageHost); @@ -266,7 +259,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore parameters.setPath(hostPath); } else if (scheme.equalsIgnoreCase("DatastoreCluster")) { if (StringUtils.isNotBlank(hypervisorType) && HypervisorType.getType(hypervisorType).equals(HypervisorType.VMware)) { - validateVcenterDetails(zoneId, storageHost); + validateVcenterDetails(zoneId, podId, clusterId,storageHost); } parameters.setType(StoragePoolType.DatastoreCluster); parameters.setHost(storageHost); @@ -371,15 +364,31 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore return dataStoreHelper.createPrimaryDataStore(parameters); } - private void validateVcenterDetails(long zoneId, String storageHost) { - VmwareDatacenterZoneMapVO vmwareDcZoneMap = vmwareDatacenterZoneMapDao.findByZoneId(zoneId); - if (vmwareDcZoneMap != null) { - Long associatedVmwareDcId = vmwareDcZoneMap.getVmwareDcId(); - VmwareDatacenterVO associatedVmwareDc = vmwareDcDao.findById(associatedVmwareDcId); - if (!associatedVmwareDc.getVcenterHost().equals(storageHost)) { - throw new InvalidParameterValueException("Provided vCenter server details does not match with the existing vCenter in zone id: " + zoneId); + private void validateVcenterDetails(Long zoneId, Long podId, Long clusterId, String storageHost) { + + List allHosts = + _resourceMgr.listAllUpHosts(Host.Type.Routing, clusterId, podId, zoneId); + if (allHosts.isEmpty()) { + throw new CloudRuntimeException("No host up to associate a storage pool with in zone: " + zoneId + " pod: " + podId + " cluster: " + clusterId); + } + + boolean success = false; + for (HostVO h : allHosts) { + ValidateVcenterDetailsCommand cmd = new ValidateVcenterDetailsCommand(storageHost); + final Answer answer = agentMgr.easySend(h.getId(), cmd); + if (answer != null && answer.getResult()) { + s_logger.info("Successfully validated vCenter details provided"); + return; + } else { + if (answer != null) { + throw new InvalidParameterValueException("Provided vCenter server details does not match with the existing vCenter in zone id: " + zoneId); + } else { + String msg = "Can not validate vCenter through host " + h.getId() + " due to ValidateVcenterDetailsCommand returns null"; + s_logger.warn(msg); + } } } + throw new CloudRuntimeException("Could not validate vCenter details through any of the hosts with in zone: " + zoneId + ", pod: " + podId + ", cluster: " + clusterId); } protected boolean createStoragePool(long hostId, StoragePool pool) {