Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 1.4k
engine: add support for VMware 7.0 dependency and hypervisor capability#4300
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| // | ||
| // 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 GetVmVncTicketAnswer extends Answer { | ||
| private String ticket; | ||
| public GetVmVncTicketAnswer(String ticket, boolean result, String details) { | ||
| this.ticket = ticket; | ||
| this.result = result; | ||
| this.details = details; | ||
| } | ||
| public String getTicket() { | ||
| return ticket; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| // | ||
| // 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 GetVmVncTicketCommand extends Command { | ||
| private String vmInternalName; | ||
| public GetVmVncTicketCommand(String vmInternalName) { | ||
| this.vmInternalName = vmInternalName; | ||
| } | ||
| public String getVmInternalName() { | ||
| return this.vmInternalName; | ||
| } | ||
| @Override | ||
| public boolean executeInSequence() { | ||
| return false; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -18,7 +18,6 @@ | ||
| --; | ||
| -- Schema upgrade from 4.15.0.0 to 4.15.1.0 | ||
| --; | ||
| -- Correct guest OS names | ||
| UPDATE `cloud`.`guest_os` SET display_name='Fedora Linux (32 bit)' WHERE id=320; | ||
| UPDATE `cloud`.`guest_os` SET display_name='Mandriva Linux (32 bit)' WHERE id=323; | ||
| @@ -56,3 +55,80 @@ INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervis | ||
| -- Add support for Ubuntu Focal Fossa 20.04 for Xenserver 8.2.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (335, UUID(), 10, 'Ubuntu 20.04 LTS', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '8.2.0', 'Ubuntu Focal Fossa 20.04', 330, now(), 0); | ||
| ------------------------------------------------------------------------------------------------------------- | ||
| -- Add support for VMware 7.0 | ||
| INSERT IGNORE INTO `cloud`.`hypervisor_capabilities` (uuid, hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled, max_data_volumes_limit, max_hosts_per_cluster, storage_motion_supported, vm_snapshot_enabled) values (UUID(), 'VMware', '7.0', 1024, 0, 59, 64, 1, 1); | ||
| INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'VMware', '7.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='VMware' AND hypervisor_version='6.7'; | ||
| -- Add support for darwin19_64Guest from VMware 7.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (336, UUID(), 7, 'macOS 10.15 (64 bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0', 'darwin19_64Guest', 336, now(), 0); | ||
| -- Add support for debian11_64Guest from VMware 7.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (337, UUID(), 2, 'Debian GNU/Linux 11 (64-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0', 'debian11_64Guest', 337, now(), 0); | ||
| -- Add support for debian11Guest from VMware 7.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (338, UUID(), 2, 'Debian GNU/Linux 11 (32-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0', 'debian11Guest', 338, now(), 0); | ||
| -- Add support for windows2019srv_64Guest from VMware 7.0 | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0', 'windows2019srv_64Guest', 276, now(), 0); | ||
| -- Add support for VMware 7.0.1.0 | ||
| INSERT IGNORE INTO `cloud`.`hypervisor_capabilities` (uuid, hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled, max_data_volumes_limit, max_hosts_per_cluster, storage_motion_supported, vm_snapshot_enabled) values (UUID(), 'VMware', '7.0.1.0', 1024, 0, 59, 64, 1, 1); | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @nvazquez does CloudStack/VMware plugin make a difference between 7.0 and 7.0.1.0 from the DB? Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @rhtyd yes - hosts on 7.0 u1 report the version 7.0.1.0 MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should the version be just MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. or is it the version returned by vcenter? Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've checked the code and this value comes from the SDK interaction to the hostMO.getHostAboutInfo().getApiVersion(); In a test environment I get: | ||
| INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'VMware', '7.0.1.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='VMware' AND hypervisor_version='7.0'; | ||
| -- Add support for amazonlinux3_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (339, UUID(), 7, 'Amazon Linux 3 (64 bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'amazonlinux3_64Guest', 339, now(), 0); | ||
| -- Add support for asianux9_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (340, UUID(), 7, 'Asianux Server 9 (64 bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'asianux9_64Guest', 340, now(), 0); | ||
| -- Add support for centos9_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (341, UUID(), 1, 'CentOS 9', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'centos9_64Guest', 341, now(), 0); | ||
| -- Add support for darwin20_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (342, UUID(), 7, 'macOS 11 (64 bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'darwin20_64Guest', 342, now(), 0); | ||
| -- Add support for darwin21_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'darwin21_64Guest', 342, now(), 0); | ||
| -- Add support for freebsd13_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (343, UUID(), 9, 'FreeBSD 13 (64-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'freebsd13_64Guest', 343, now(), 0); | ||
| -- Add support for freebsd13Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (344, UUID(), 9, 'FreeBSD 13 (32-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'freebsd13Guest', 344, now(), 0); | ||
| -- Add support for oracleLinux9_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (345, UUID(), 3, 'Oracle Linux 9', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'oracleLinux9_64Guest', 345, now(), 0); | ||
| -- Add support for other5xLinux64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (346, UUID(), 2, 'Linux 5.x Kernel (64-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'other5xLinux64Guest', 346, now(), 0); | ||
| -- Add support for other5xLinuxGuest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (347, UUID(), 2, 'Linux 5.x Kernel (32-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'other5xLinuxGuest', 347, now(), 0); | ||
| -- Add support for rhel9_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (348, UUID(), 4, 'Red Hat Enterprise Linux 9.0', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'rhel9_64Guest', 348, now(), 0); | ||
| -- Add support for sles16_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (349, UUID(), 5, 'SUSE Linux Enterprise Server 16 (64-bit)', now()); | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'sles16_64Guest', 349, now(), 0); | ||
| -- Add support for windows2019srvNext_64Guest from VMware 7.0.1.0 | ||
| INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '7.0.1.0', 'windows2019srvNext_64Guest', 276, now(), 0); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -37,6 +37,13 @@ | ||
| import javax.servlet.http.HttpServletResponse; | ||
| import javax.servlet.http.HttpSession; | ||
| import com.cloud.agent.AgentManager; | ||
| import com.cloud.agent.api.Answer; | ||
| import com.cloud.agent.api.GetVmVncTicketAnswer; | ||
| import com.cloud.agent.api.GetVmVncTicketCommand; | ||
| import com.cloud.exception.AgentUnavailableException; | ||
| import com.cloud.exception.OperationTimedoutException; | ||
| import com.cloud.utils.StringUtils; | ||
| import org.apache.cloudstack.framework.security.keys.KeysManager; | ||
| import org.apache.commons.codec.binary.Base64; | ||
| import org.apache.log4j.Logger; | ||
| @@ -94,6 +101,8 @@ public class ConsoleProxyServlet extends HttpServlet { | ||
| UserVmDetailsDao _userVmDetailsDao; | ||
| @Inject | ||
| KeysManager _keysMgr; | ||
| @Inject | ||
| AgentManager agentManager; | ||
| static KeysManager s_keysMgr; | ||
| @@ -427,6 +436,47 @@ private String composeThumbnailUrl(String rootUrl, VirtualMachine vm, HostVO hos | ||
| return sb.toString(); | ||
| } | ||
| /** | ||
| * Sets the URL to establish a VNC over websocket connection | ||
| */ | ||
| private void setWebsocketUrl(VirtualMachine vm, ConsoleProxyClientParam param) { | ||
| String ticket = acquireVncTicketForVmwareVm(vm); | ||
nvazquez marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| if (StringUtils.isBlank(ticket)) { | ||
| s_logger.error("Could not obtain VNC ticket for VM " + vm.getInstanceName()); | ||
| return; | ||
| } | ||
| String wsUrl = composeWebsocketUrlForVmwareVm(ticket, param); | ||
| param.setWebsocketUrl(wsUrl); | ||
| } | ||
| /** | ||
| * Format expected: wss://<ESXi_HOST_IP>:443/ticket/<TICKET_ID> | ||
| */ | ||
| private String composeWebsocketUrlForVmwareVm(String ticket, ConsoleProxyClientParam param) { | ||
| param.setClientHostPort(443); | ||
| return String.format("wss://%s:%s/ticket/%s", param.getClientHostAddress(), param.getClientHostPort(), ticket); | ||
| } | ||
| /** | ||
| * Acquires a ticket to be used for console proxy as described in 'Removal of VNC Server from ESXi' on: | ||
| * https://docs.vmware.com/en/VMware-vSphere/7.0/rn/vsphere-esxi-vcenter-server-70-release-notes.html | ||
| */ | ||
| private String acquireVncTicketForVmwareVm(VirtualMachine vm) { | ||
| try { | ||
| s_logger.info("Acquiring VNC ticket for VM = " + vm.getHostName()); | ||
| GetVmVncTicketCommand cmd = new GetVmVncTicketCommand(vm.getInstanceName()); | ||
| Answer answer = agentManager.send(vm.getHostId(), cmd); | ||
| GetVmVncTicketAnswer ans = (GetVmVncTicketAnswer) answer; | ||
nvazquez marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| if (!ans.getResult()) { | ||
| s_logger.info("VNC ticket could not be acquired correctly: " + ans.getDetails()); | ||
| } | ||
| return ans.getTicket(); | ||
| } catch (AgentUnavailableException | OperationTimedoutException e) { | ||
| s_logger.error("Error acquiring ticket", e); | ||
| return null; | ||
nvazquez marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| } | ||
| } | ||
| private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO hostVo, InetAddress addr) { | ||
| StringBuffer sb = new StringBuffer(rootUrl); | ||
| String host = hostVo.getPrivateIpAddress(); | ||
| @@ -477,6 +527,10 @@ private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO | ||
| param.setTicket(ticket); | ||
| param.setSourceIP(addr != null ? addr.getHostAddress(): null); | ||
| if (requiresVncOverWebSocketConnection(vm, hostVo)) { | ||
| setWebsocketUrl(vm, param); | ||
| } | ||
| if (details != null) { | ||
| param.setLocale(details.getValue()); | ||
| } | ||
| @@ -513,6 +567,14 @@ private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO | ||
| return sb.toString(); | ||
| } | ||
| /** | ||
| * Since VMware 7.0 VNC servers are deprecated, it uses a ticket to create a VNC over websocket connection | ||
| * Check: https://docs.vmware.com/en/VMware-vSphere/7.0/rn/vsphere-esxi-vcenter-server-70-release-notes.html | ||
| */ | ||
| private boolean requiresVncOverWebSocketConnection(VirtualMachine vm, HostVO hostVo) { | ||
| return vm.getHypervisorType() == Hypervisor.HypervisorType.VMware && hostVo.getHypervisorVersion().compareTo("7.0") >= 0; | ||
| } | ||
| public static String genAccessTicket(String host, String port, String sid, String tag) { | ||
| return genAccessTicket(host, port, sid, tag, new Date()); | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.