From 26b738ae179cc3134220ff9cb3eb23de6981aad0 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Fri, 18 Mar 2022 14:37:36 +0530 Subject: [PATCH 1/4] agent: Pass uefi enabled status as part of ready command --- .../java/com/cloud/agent/api/ReadyAnswer.java | 15 +++++++++++++ .../cloud/agent/manager/AgentManagerImpl.java | 14 +++++++++++++ .../wrapper/LibvirtReadyCommandWrapper.java | 21 ++++++++++++++++++- .../vmware/resource/VmwareResource.java | 12 ++++++++++- .../xenbase/CitrixReadyCommandWrapper.java | 13 +++++++++++- 5 files changed, 72 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/ReadyAnswer.java b/core/src/main/java/com/cloud/agent/api/ReadyAnswer.java index 700f64b4b15d..42f18a23aba4 100644 --- a/core/src/main/java/com/cloud/agent/api/ReadyAnswer.java +++ b/core/src/main/java/com/cloud/agent/api/ReadyAnswer.java @@ -19,7 +19,12 @@ package com.cloud.agent.api; +import java.util.Map; + public class ReadyAnswer extends Answer { + + private Map detailsMap; + protected ReadyAnswer() { } @@ -31,4 +36,14 @@ public ReadyAnswer(ReadyCommand cmd, String details) { super(cmd, false, details); } + public ReadyAnswer(ReadyCommand cmd, Map detailsMap) { + super(cmd, true, null); + this.detailsMap = detailsMap; + } + + public Map getDetailsMap() { + return detailsMap; + } + + } diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index 70a4fa78d5fc..d49d68751566 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -600,6 +600,20 @@ protected AgentAttache notifyMonitorsOfConnection(final AgentAttache attache, fi // return the attache instead of null, even it is disconnectede handleDisconnectWithoutInvestigation(attache, Event.AgentDisconnected, true, true); } + if (answer instanceof ReadyAnswer) { + ReadyAnswer readyAnswer = (ReadyAnswer)answer; + Map detailsMap = readyAnswer.getDetailsMap(); + s_logger.info("Got details map : " + detailsMap); + if (detailsMap != null) { + String uefiEnabled = detailsMap.get(Host.HOST_UEFI_ENABLE); + s_logger.info("Got HOST_UEFI_ENABLE : " + uefiEnabled); + if (uefiEnabled != null) { + _hostDao.loadDetails(host); + host.getDetails().put(Host.HOST_UEFI_ENABLE, uefiEnabled); + _hostDao.saveDetails(host); + } + } + } agentStatusTransitTo(host, Event.Ready, _nodeId); attache.ready(); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java index c48f91f3eb3f..ffe3110a316a 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java @@ -19,18 +19,37 @@ package com.cloud.hypervisor.kvm.resource.wrapper; +import java.util.HashMap; +import java.util.Map; + import com.cloud.agent.api.Answer; import com.cloud.agent.api.ReadyAnswer; import com.cloud.agent.api.ReadyCommand; +import com.cloud.host.Host; import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.script.Script; + +import org.apache.log4j.Logger; @ResourceWrapper(handles = ReadyCommand.class) public final class LibvirtReadyCommandWrapper extends CommandWrapper { + private static final Logger s_logger = Logger.getLogger(LibvirtReadyCommandWrapper.class); + @Override public Answer execute(final ReadyCommand command, final LibvirtComputingResource libvirtComputingResource) { - return new ReadyAnswer(command); + Map hostDetails = new HashMap(); + + String cmd = "rpm -qa | grep -i ovmf"; + s_logger.debug("Running command : " + cmd); + int result = Script.runSimpleBashScriptForExitValue(cmd); + s_logger.debug("Got result : " + result); + if (result == 0) { + hostDetails.put(Host.HOST_UEFI_ENABLE, Boolean.toString(true)); + } + + return new ReadyAnswer(command, hostDetails); } } \ No newline at end of file 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 74a797de6851..19e2a3eacba2 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 @@ -211,6 +211,7 @@ import com.cloud.dc.Vlan; import com.cloud.exception.CloudException; import com.cloud.exception.InternalErrorException; +import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.guru.VMwareGuru; @@ -3930,8 +3931,17 @@ protected Answer execute(ReadyCommand cmd) { try { VmwareContext context = getServiceContext(); VmwareHypervisorHost hyperHost = getHyperHost(context); + + Map hostDetails = new HashMap(); + ManagedObjectReference morHost = hyperHost.getMor(); + HostMO hostMo = new HostMO(context, morHost); + boolean uefiLegacySupported = hostMo.isUefiLegacySupported(); + if (uefiLegacySupported) { + hostDetails.put(Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); + } + if (hyperHost.isHyperHostConnected()) { - return new ReadyAnswer(cmd); + return new ReadyAnswer(cmd, hostDetails); } else { return new ReadyAnswer(cmd, "Host is not in connect state"); } diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java index 78359f0ab915..121bc210c068 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java @@ -19,14 +19,19 @@ package com.cloud.hypervisor.xenserver.resource.wrapper.xenbase; +import java.util.Map; +import java.util.HashMap; import java.util.Set; import org.apache.log4j.Logger; import org.apache.xmlrpc.XmlRpcException; +import static com.cloud.hypervisor.xenserver.discoverer.XcpServerDiscoverer.isUefiSupported; + import com.cloud.agent.api.Answer; import com.cloud.agent.api.ReadyAnswer; import com.cloud.agent.api.ReadyCommand; +import com.cloud.hypervisor.xenserver.resource.CitrixHelper; import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; @@ -44,6 +49,7 @@ public final class CitrixReadyCommandWrapper extends CommandWrapper hostDetails = new HashMap(); // Ignore the result of the callHostPlugin. Even if unmounting the // snapshots dir fails, let Ready command // succeed. @@ -55,6 +61,11 @@ public Answer execute(final ReadyCommand command, final CitrixResourceBase citri final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid()); final Set vms = host.getResidentVMs(conn); citrixResourceBase.destroyPatchVbd(conn, vms); + + final Host.Record hr = host.getRecord(conn); + if (isUefiSupported(CitrixHelper.getProductVersion(hr))) { + hostDetails.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); + } } catch (final Exception e) { } try { @@ -70,6 +81,6 @@ public Answer execute(final ReadyCommand command, final CitrixResourceBase citri return new ReadyAnswer(command, "Unable to cleanup halted vms"); } - return new ReadyAnswer(command); + return new ReadyAnswer(command, hostDetails); } } \ No newline at end of file From 11fdae338f7401b77223c8bed174c5c7b8d5a604 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Fri, 18 Mar 2022 16:23:00 +0530 Subject: [PATCH 2/4] Cleanup --- .../com/cloud/agent/manager/AgentManagerImpl.java | 3 +-- .../wrapper/LibvirtReadyCommandWrapper.java | 14 +++++++++----- .../hypervisor/vmware/VmwareServerDiscoverer.java | 4 ---- .../xenserver/discoverer/XcpServerDiscoverer.java | 3 --- .../xenserver/resource/CitrixResourceBase.java | 3 --- .../kvm/discoverer/LibvirtServerDiscoverer.java | 8 -------- 6 files changed, 10 insertions(+), 25 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index d49d68751566..24e4d969fc27 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -603,10 +603,9 @@ protected AgentAttache notifyMonitorsOfConnection(final AgentAttache attache, fi if (answer instanceof ReadyAnswer) { ReadyAnswer readyAnswer = (ReadyAnswer)answer; Map detailsMap = readyAnswer.getDetailsMap(); - s_logger.info("Got details map : " + detailsMap); if (detailsMap != null) { String uefiEnabled = detailsMap.get(Host.HOST_UEFI_ENABLE); - s_logger.info("Got HOST_UEFI_ENABLE : " + uefiEnabled); + s_logger.debug(String.format("Got HOST_UEFI_ENABLE [%s] for hostId [%s]:", uefiEnabled, host.getUuid())); if (uefiEnabled != null) { _hostDao.loadDetails(host); host.getDetails().put(Host.HOST_UEFI_ENABLE, uefiEnabled); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java index ffe3110a316a..69fe324ee309 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java @@ -42,14 +42,18 @@ public final class LibvirtReadyCommandWrapper extends CommandWrapper hostDetails = new HashMap(); + if (hostSupportsUefi()) { + hostDetails.put(Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); + } + + return new ReadyAnswer(command, hostDetails); + } + + private boolean hostSupportsUefi() { String cmd = "rpm -qa | grep -i ovmf"; s_logger.debug("Running command : " + cmd); int result = Script.runSimpleBashScriptForExitValue(cmd); s_logger.debug("Got result : " + result); - if (result == 0) { - hostDetails.put(Host.HOST_UEFI_ENABLE, Boolean.toString(true)); - } - - return new ReadyAnswer(command, hostDetails); + return result == 0; } } \ No newline at end of file diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java index f1f3b709cfc4..e1c6ddfbbc52 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java @@ -367,10 +367,6 @@ public VmwareServerDiscoverer() { details.put("url", hostMo.getHostName()); details.put("username", username); details.put("password", password); - boolean uefiLegacySupported = hostMo.isUefiLegacySupported(); - if (uefiLegacySupported) { - details.put(Host.HOST_UEFI_ENABLE, "true"); - } String guid = morHost.getType() + ":" + morHost.getValue() + "@" + url.getHost(); details.put("guid", guid); diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index bbf3686750d7..095ba8108417 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -321,9 +321,6 @@ protected boolean poolHasHotFix(Connection conn, String hostIp, String hotFixUui details.put("username", username); params.put("username", username); details.put("password", password); - if (isUefiSupported(prodVersion)) { - details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); - } params.put("password", password); params.put("zone", Long.toString(dcId)); params.put("guid", record.uuid); diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index fffbd800412e..e860b7172084 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1779,9 +1779,6 @@ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand c } details.put("product_brand", productBrand); details.put("product_version", _host.getProductVersion()); - if (isUefiSupported(_host.getProductVersion())) { - details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); - } if (hr.softwareVersion.get("product_version_text_short") != null) { details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short")); cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short")); diff --git a/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java b/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java index 0b18ea901038..50356d05c61d 100644 --- a/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java +++ b/server/src/main/java/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java @@ -214,8 +214,6 @@ private void setupAgentSecurity(final Connection sshConnection, final String age @Override public Map> find(long dcId, Long podId, Long clusterId, URI uri, String username, String password, List hostTags) throws DiscoveryException { - boolean isUefiSupported = false; - ClusterVO cluster = _clusterDao.findById(clusterId); if (cluster == null || cluster.getHypervisorType() != getHypervisorType()) { if (s_logger.isInfoEnabled()) @@ -280,11 +278,6 @@ private void setupAgentSecurity(final Connection sshConnection, final String age throw new DiscoveredWithErrorException(errorMsg); } - if (SSHCmdHelper.sshExecuteCmd(sshConnection, "rpm -qa | grep -i ovmf", 3)) { - s_logger.debug("It's UEFI enabled KVM machine"); - isUefiSupported = true; - } - List netInfos = _networkMgr.getPhysicalNetworkInfo(dcId, getHypervisorType()); String kvmPrivateNic = null; String kvmPublicNic = null; @@ -368,7 +361,6 @@ private void setupAgentSecurity(final Connection sshConnection, final String age Map hostDetails = connectedHost.getDetails(); hostDetails.put("password", password); hostDetails.put("username", username); - hostDetails.put(Host.HOST_UEFI_ENABLE, isUefiSupported == true ? Boolean.toString(true) : Boolean.toString(false)); _hostDao.saveDetails(connectedHost); return resources; } catch (DiscoveredWithErrorException e) { From c7da0fc1b2681b0dfbc0870c766483a5f8a8c0b1 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Fri, 18 Mar 2022 16:57:32 +0530 Subject: [PATCH 3/4] Fix checkstyle --- .../java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java | 1 - .../cloud/hypervisor/xenserver/resource/CitrixResourceBase.java | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java index e1c6ddfbbc52..6a8bcda23e53 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java @@ -42,7 +42,6 @@ import com.cloud.exception.DiscoveryException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceInUseException; -import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index e860b7172084..1651e4049a65 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -16,7 +16,6 @@ // under the License. package com.cloud.hypervisor.xenserver.resource; -import static com.cloud.hypervisor.xenserver.discoverer.XcpServerDiscoverer.isUefiSupported; import static com.cloud.utils.NumbersUtil.toHumanReadableSize; import java.io.BufferedReader; From ccbd188d579ece9a0cab247218028e6b8047fdb5 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Fri, 18 Mar 2022 17:02:14 +0530 Subject: [PATCH 4/4] Save uefi status if different --- .../main/java/com/cloud/agent/manager/AgentManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java index 24e4d969fc27..b28ad9553417 100644 --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java @@ -608,8 +608,10 @@ protected AgentAttache notifyMonitorsOfConnection(final AgentAttache attache, fi s_logger.debug(String.format("Got HOST_UEFI_ENABLE [%s] for hostId [%s]:", uefiEnabled, host.getUuid())); if (uefiEnabled != null) { _hostDao.loadDetails(host); - host.getDetails().put(Host.HOST_UEFI_ENABLE, uefiEnabled); - _hostDao.saveDetails(host); + if (!uefiEnabled.equals(host.getDetails().get(Host.HOST_UEFI_ENABLE))) { + host.getDetails().put(Host.HOST_UEFI_ENABLE, uefiEnabled); + _hostDao.saveDetails(host); + } } } }