From cdc3b08759ab7268fc126840037f4dd86f188db7 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sat, 6 Mar 2021 10:13:21 +0100 Subject: [PATCH 1/6] novnc: Accept new novnc client and disconnect old session (#4531) * novnc: Reject new novnc client if novnc viewer object is still alive * #4531 novnc: Accept new novnc client and disconnect old session --- .../com/cloud/consoleproxy/ConsoleProxy.java | 18 +++++++++++++++--- .../consoleproxy/ConsoleProxyNoVNCHandler.java | 10 ++++++++-- .../consoleproxy/ConsoleProxyNoVncClient.java | 4 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java index 7a70a38b786..577d6ed8163 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java @@ -551,11 +551,23 @@ public class ConsoleProxy { !param.getClientHostPassword().equals(viewer.getClientHostPassword())) throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid"); - if (!viewer.isFrontEndAlive()) { + try { authenticationExternally(param); - viewer.initClient(param); - reportLoadChange = true; + } catch (Exception e) { + s_logger.error("Authencation failed for param: " + param); + return null; } + s_logger.info("Initializing new novnc client and disconnecting existing session"); + try { + ((ConsoleProxyNoVncClient)viewer).getSession().disconnect(); + } catch (IOException e) { + s_logger.error("Exception while disconnect session of novnc viewer object: " + viewer, e); + } + removeViewer(viewer); + viewer = new ConsoleProxyNoVncClient(session); + viewer.initClient(param); + connectionMap.put(clientKey, viewer); + reportLoadChange = true; } if (reportLoadChange) { diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java index 349d98408a1..b3359b5863e 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java @@ -38,7 +38,7 @@ import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; @WebSocket public class ConsoleProxyNoVNCHandler extends WebSocketHandler { - private ConsoleProxyNoVncClient viewer; + private ConsoleProxyNoVncClient viewer = null; private static final Logger s_logger = Logger.getLogger(ConsoleProxyNoVNCHandler.class); public ConsoleProxyNoVNCHandler() { @@ -130,12 +130,18 @@ public class ConsoleProxyNoVNCHandler extends WebSocketHandler { } catch (Exception e) { s_logger.warn("Failed to create viewer due to " + e.getMessage(), e); return; + } finally { + if (viewer == null) { + session.disconnect(); + } } } @OnWebSocketClose public void onClose(Session session, int statusCode, String reason) throws IOException, InterruptedException { - ConsoleProxy.removeViewer(viewer); + if (viewer != null) { + ConsoleProxy.removeViewer(viewer); + } } @OnWebSocketFrame diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java index 97963f80caf..353c32da24b 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java @@ -235,4 +235,8 @@ public class ConsoleProxyNoVncClient implements ConsoleProxyClient { return ""; } + public Session getSession() { + return session; + } + } From 58a3f90a5146e93d2a4699cef439319f8e664f7d Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sat, 6 Mar 2021 10:23:40 +0100 Subject: [PATCH 2/6] server: fix failed to remove template/iso if upload from local fails (#4626) * server: fix failed to remove template/iso if upload from local fails When upload template/iso/volume from local fails, the install_path will not be a full path of file so removing it will fail. ``` mysql> select install_path from template_store_ref; +--------------------------------------------------------------------+ | install_path | +--------------------------------------------------------------------+ | template/tmpl/1/3/805f4763-248e-40ec-b79a-b868cc480d0a.qcow2 | | template/tmpl/1/4/c7e32c9e-5e72-3726-85cf-aa5ccd84118d.qcow2 | | template/tmpl/2/201/bc4f4f08-138a-31b8-af1a-d4450eff7982.qcow2 | | template/tmpl/2/202 | | template/tmpl/2/203/203-2-d47f8cde-a2a8-31e7-a826-2628ad98a6c8.iso | | template/tmpl/2/204 | | template/tmpl/5/205 | | template/tmpl/2/206 | | template/tmpl/2/207 | | template/tmpl/2/208 | | template/tmpl/2/209 | | template/tmpl/2/210 | +--------------------------------------------------------------------+ 12 rows in set (0.00 sec) mysql> select install_path from volume_store_ref; +---------------------------------------------------------+ | install_path | +---------------------------------------------------------+ | volumes/2/22 | | volumes/2/19/f93face9-6521-4184-b89a-cb07f86bbae8.qcow2 | | volumes/2/23 | | volumes/2/24 | +---------------------------------------------------------+ 4 rows in set (0.00 sec) ``` * server: disallow removing template/iso in NotUpload and UploadInProgress state --- .../main/java/com/cloud/template/TemplateAdapterBase.java | 8 ++++++++ .../storage/resource/NfsSecondaryStorageResource.java | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java index 0e88c147f51..c42ca10bf30 100644 --- a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java +++ b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java @@ -456,6 +456,10 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat throw new InvalidParameterValueException("Please specify a valid template."); } + if (template.getState() == VirtualMachineTemplate.State.NotUploaded || template.getState() == VirtualMachineTemplate.State.UploadInProgress) { + throw new InvalidParameterValueException("The template is either getting uploaded or it may be initiated shortly, please wait for it to be completed"); + } + return new TemplateProfile(userId, template, zoneId); } @@ -495,6 +499,10 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat throw new InvalidParameterValueException("Please specify a valid iso."); } + if (template.getState() == VirtualMachineTemplate.State.NotUploaded || template.getState() == VirtualMachineTemplate.State.UploadInProgress) { + throw new InvalidParameterValueException("The iso is either getting uploaded or it may be initiated shortly, please wait for it to be completed"); + } + return new TemplateProfile(userId, template, zoneId); } diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index f4ae30e3e8f..274815d39c4 100644 --- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -2253,6 +2253,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S File tmpltParent = null; if (tmpltPath.exists() && tmpltPath.isDirectory()) { tmpltParent = tmpltPath; + } else if (absoluteTemplatePath.endsWith(File.separator + obj.getId())) { + // the path ends with /