From cf2e27a14eed1d915b31c36b051e31b38d685ee6 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Fri, 2 Jul 2021 13:49:13 +0530 Subject: [PATCH 01/45] keypairs added in api-constants --- api/src/main/java/org/apache/cloudstack/api/ApiConstants.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index b060b5a21762..fbf6b13fe309 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -428,6 +428,7 @@ public class ApiConstants { public static final String NETWORKRATE = "networkrate"; public static final String HOST_TAGS = "hosttags"; public static final String SSH_KEYPAIR = "keypair"; + public static final String SSH_KEYPAIRS = "keypairs"; public static final String HTTPMETHOD = "httpmethod"; public static final String HOST_CPU_CAPACITY = "hostcpucapacity"; public static final String HOST_CPU_NUM = "hostcpunum"; From ac655fe514ed97ef093d42f20e260a49b5d795e2 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Fri, 2 Jul 2021 13:50:22 +0530 Subject: [PATCH 02/45] names parameter added --- .../cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index ce481d8814c9..3c76283b9773 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -42,6 +42,8 @@ import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; +import java.util.List; + @APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. " + "The virtual machine must be in a \"Stopped\" state. [async]", responseView = ResponseView.Restricted, entityType = {VirtualMachine.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = true) @@ -58,9 +60,12 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = UserVmResponse.class, required = true, description = "The ID of the virtual machine") private Long id; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, required = true, description = "name of the ssh key pair used to login to the virtual machine") + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pair used to login to the virtual machine") private String name; + @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs used to login to the virtual machine") + List names; + //Owner information @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional account for the ssh key. Must be used with domainId.") private String accountName; @@ -82,6 +87,8 @@ public String getName() { return name; } + public List getNames() { return names; } + public Long getId() { return id; } From 2c7404fce85f1b7ea516753c91c25216f9798d80 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Fri, 2 Jul 2021 13:51:07 +0530 Subject: [PATCH 03/45] findbynames method added in dao --- .../schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java index e035e9688c3e..ec3e87004342 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java @@ -37,4 +37,5 @@ public interface SSHKeyPairDao extends GenericDao { public SSHKeyPairVO findByPublicKey(long accountId, long domainId, String publicKey); + List findByNames(long accountId, long domainId, List names); } From 4cdd371293670e5b89f85dd7139075350c2d2edc Mon Sep 17 00:00:00 2001 From: bicrxm Date: Fri, 2 Jul 2021 13:52:01 +0530 Subject: [PATCH 04/45] change in impl to find and reset multiple keys --- .../java/com/cloud/vm/UserVmManagerImpl.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index c1743e74623d..4b1940acfdc6 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -855,15 +855,40 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce throw new InvalidParameterValueException("Vm " + userVm + " should be stopped to do SSH Key reset"); } - SSHKeyPairVO s = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), cmd.getName()); - if (s == null) { - throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' does not exist for account " + owner.getAccountName() - + " in specified domain id"); + if (cmd.getName() == null && cmd.getNames() == null) { + throw new InvalidParameterValueException("No keypair name given"); + } + + SSHKeyPairVO s = null; + if (cmd.getName() != null) { + s = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), cmd.getName()); + } + + List s_list = null; + if (cmd.getNames() != null) { + s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); + } + + if (s_list == null && s == null) { + throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + + " in specified domain id"); } _accountMgr.checkAccess(caller, null, true, userVm); - String sshPublicKey = s.getPublicKey(); + String sshPublicKey = null; + + if (s != null) { + sshPublicKey = s.getPublicKey(); + } + + if (s_list != null) { + for (SSHKeyPairVO s_each : s_list) { + String publicKey = s_each.getPublicKey(); + if (sshPublicKey != null) sshPublicKey.concat("/n"); + sshPublicKey.concat(publicKey); + } + } boolean result = resetVMSSHKeyInternal(vmId, sshPublicKey); From 274ab95a4fa4738a504c4dcf10f069ebde6df1dc Mon Sep 17 00:00:00 2001 From: bicrxm Date: Fri, 2 Jul 2021 13:52:35 +0530 Subject: [PATCH 05/45] findbynames method implemented --- .../java/com/cloud/user/dao/SSHKeyPairDaoImpl.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java index 1a773ce926bf..0f2788ca1874 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -63,6 +63,18 @@ public SSHKeyPairVO findByName(long accountId, long domainId, String name) { return findOneBy(sc); } + @Override + public List findByNames(long accountId, long domainId, List names) { + List s_list = null; + for (String name : names) { + SSHKeyPairVO s = findByName(accountId, domainId, name); + if (s != null) { + s_list.add(s); + } + } + return s_list; + } + @Override public SSHKeyPairVO findByPublicKey(String publicKey) { SearchCriteria sc = createSearchCriteria(); @@ -79,6 +91,7 @@ public SSHKeyPairVO findByPublicKey(long accountId, long domainId, String public return findOneBy(sc); } + @Override public boolean deleteByName(long accountId, long domainId, String name) { SSHKeyPairVO pair = findByName(accountId, domainId, name); From 4d8f56e674dbbbd1377733f01d826304fa883c48 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Sat, 3 Jul 2021 23:07:03 +0530 Subject: [PATCH 06/45] log the publickeys, check the ssh keys given exists or not --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4b1940acfdc6..8f31fb75d80c 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -880,12 +880,17 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce if (s != null) { sshPublicKey = s.getPublicKey(); + s_logger.info("the public key for single ssh is " + sshPublicKey); } if (s_list != null) { for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); - if (sshPublicKey != null) sshPublicKey.concat("/n"); + if (sshPublicKey != null) { + sshPublicKey.concat("/n"); + s_logger.info("the public key for keypair name" + s_each.getName() + "is " + sshPublicKey); + } + else s_logger.error("ssh key with the given name " + s_each.getName() + "does not exist"); sshPublicKey.concat(publicKey); } } From 65029d93bd9c359540afaa215b8b038fafcc25a3 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Mon, 5 Jul 2021 22:29:24 +0530 Subject: [PATCH 07/45] new ArrayList<> --- .../src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java index 0f2788ca1874..7fc764a2b8a4 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.user.dao; +import java.util.ArrayList; import java.util.List; @@ -65,7 +66,7 @@ public SSHKeyPairVO findByName(long accountId, long domainId, String name) { @Override public List findByNames(long accountId, long domainId, List names) { - List s_list = null; + List s_list = new ArrayList(); for (String name : names) { SSHKeyPairVO s = findByName(accountId, domainId, name); if (s != null) { From 00e26346aa9b1f731147bd9e5c8979f7620c1aaa Mon Sep 17 00:00:00 2001 From: bicrxm Date: Tue, 6 Jul 2021 11:19:11 +0530 Subject: [PATCH 08/45] SQL IN toArray --- .../com/cloud/user/dao/SSHKeyPairDaoImpl.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java index 7fc764a2b8a4..cd5c54595ea0 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -20,6 +20,7 @@ import java.util.List; +import com.cloud.utils.db.Filter; import org.springframework.stereotype.Component; import com.cloud.user.SSHKeyPairVO; @@ -66,14 +67,12 @@ public SSHKeyPairVO findByName(long accountId, long domainId, String name) { @Override public List findByNames(long accountId, long domainId, List names) { - List s_list = new ArrayList(); - for (String name : names) { - SSHKeyPairVO s = findByName(accountId, domainId, name); - if (s != null) { - s_list.add(s); - } - } - return s_list; + SearchCriteria sc = createSearchCriteria(); + final Filter s_f = new Filter(SSHKeyPairVO.class,"name",false, null, null); + sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); + sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); + sc.addAnd("name", SearchCriteria.Op.IN, names.toArray()); + return this.search(sc, s_f); } @Override From 33b8bd85bb8683e4d3653be34684e663ef4a83c2 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Tue, 6 Jul 2021 11:22:07 +0530 Subject: [PATCH 09/45] keypair --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 8f31fb75d80c..ef36bf4fb20e 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -886,9 +886,9 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce if (s_list != null) { for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); - if (sshPublicKey != null) { + if (publicKey != null) { sshPublicKey.concat("/n"); - s_logger.info("the public key for keypair name" + s_each.getName() + "is " + sshPublicKey); + s_logger.info("the public key for keypair name " + s_each.getName() + "is " + sshPublicKey); } else s_logger.error("ssh key with the given name " + s_each.getName() + "does not exist"); sshPublicKey.concat(publicKey); From 055e8b317994093095868d9588aa0f5d9d0486c0 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Tue, 6 Jul 2021 13:20:23 +0530 Subject: [PATCH 10/45] null pointer exception solved with + concatanation --- .../src/main/java/com/cloud/vm/UserVmManagerImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index ef36bf4fb20e..9b81bb8a15e7 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -887,11 +887,13 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); if (publicKey != null) { - sshPublicKey.concat("/n"); - s_logger.info("the public key for keypair name " + s_each.getName() + "is " + sshPublicKey); + if (sshPublicKey != null) { + sshPublicKey.concat("/n"); + } + sshPublicKey = sshPublicKey + publicKey; + s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); } - else s_logger.error("ssh key with the given name " + s_each.getName() + "does not exist"); - sshPublicKey.concat(publicKey); + else s_logger.error("ssh key with the given name " + s_each.getName() + " does not exist"); } } From fb0dce937c5ac0efbc68eb06024c85abe9b88af2 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Tue, 6 Jul 2021 13:21:38 +0530 Subject: [PATCH 11/45] null pointer exception solved with + concatanation --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 9b81bb8a15e7..4ee77250bc19 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -888,7 +888,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce String publicKey = s_each.getPublicKey(); if (publicKey != null) { if (sshPublicKey != null) { - sshPublicKey.concat("/n"); + sshPublicKey = sshPublicKey + "/n" } sshPublicKey = sshPublicKey + publicKey; s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); From 3b13ab75c5315796150e61d32abb66160cf1ce29 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Tue, 6 Jul 2021 13:22:23 +0530 Subject: [PATCH 12/45] error resolved --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4ee77250bc19..79527b727af1 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -888,7 +888,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce String publicKey = s_each.getPublicKey(); if (publicKey != null) { if (sshPublicKey != null) { - sshPublicKey = sshPublicKey + "/n" + sshPublicKey = sshPublicKey + "/n"; } sshPublicKey = sshPublicKey + publicKey; s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); From f271ab5f409a908b6b120361b17671a7e56f4ca2 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Thu, 15 Jul 2021 11:20:02 +0530 Subject: [PATCH 13/45] keypair name to names in uservmresponse --- .../cloudstack/api/response/UserVmResponse.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java index cb0d6fa0cc72..de59ad1ff601 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java @@ -274,9 +274,9 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co @Param(description = "List of read-only Vm details as comma separated string.", since = "4.16.0") private String readOnlyDetails; - @SerializedName(ApiConstants.SSH_KEYPAIR) - @Param(description = "ssh key-pair") - private String keyPairName; + @SerializedName(ApiConstants.SSH_KEYPAIRS) + @Param(description = "ssh key-pairs") + private String keyPairNames; @SerializedName("affinitygroup") @Param(description = "list of affinity groups associated with the virtual machine", responseObject = AffinityGroupResponse.class) @@ -570,8 +570,8 @@ public String getInstanceName() { return instanceName; } - public String getKeyPairName() { - return keyPairName; + public String getKeyPairNames() { + return keyPairNames; } public Set getAffinityGroupList() { @@ -830,8 +830,8 @@ public void setTags(Set tags) { this.tags = tags; } - public void setKeyPairName(String keyPairName) { - this.keyPairName = keyPairName; + public void setKeyPairNames(String keyPairNames) { + this.keyPairNames = keyPairNames; } public void setAffinityGroupList(Set affinityGroups) { From 2621b67d015e47ad94566e81de0328ef9ed472b1 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Thu, 15 Jul 2021 11:21:39 +0530 Subject: [PATCH 14/45] keypair name is set in the uservmresponse, from the details --- .../main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 09eaee356e7e..f679e1330686 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -204,7 +204,6 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us userVmResponse.setPublicIpId(userVm.getPublicIpUuid()); userVmResponse.setPublicIp(userVm.getPublicIpAddress()); - userVmResponse.setKeyPairName(userVm.getKeypairName()); userVmResponse.setOsTypeId(userVm.getGuestOsUuid()); GuestOS guestOS = ApiDBUtils.findGuestOSById(userVm.getGuestOsId()); if (guestOS != null) { @@ -325,6 +324,10 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us if (vmDetails != null) { Map resourceDetails = new HashMap(); for (UserVmDetailVO userVmDetailVO : vmDetails) { + if (userVmDetailVO.getName() == ApiConstants.SSH_KEYPAIRS) { + userVmResponse.setKeyPairNames(userVmDetailVO.getValue()); + continue; + } if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) || (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES))) { resourceDetails.put(userVmDetailVO.getName(), userVmDetailVO.getValue()); From 0f2ffdb9c2814c650138b41e17224dbb4e285ef1 Mon Sep 17 00:00:00 2001 From: bicrxm Date: Thu, 15 Jul 2021 11:26:48 +0530 Subject: [PATCH 15/45] null checks are removed, keypairnames are stored in a string, sent to the resetvmsshinternal, and added in details --- .../java/com/cloud/vm/UserVmManagerImpl.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 79527b727af1..4198a0efb479 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -859,14 +859,22 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce throw new InvalidParameterValueException("No keypair name given"); } + String keypairnames = null; SSHKeyPairVO s = null; if (cmd.getName() != null) { s = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), cmd.getName()); + keypairnames = keypairnames + cmd.getName(); } List s_list = null; if (cmd.getNames() != null) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); + for (String keypairname : cmd.getNames()) { + if (keypairnames != null) { + keypairnames = keypairnames + ", "; + } + keypairnames = keypairnames + keypairname; + } } if (s_list == null && s == null) { @@ -886,18 +894,13 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce if (s_list != null) { for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); - if (publicKey != null) { - if (sshPublicKey != null) { - sshPublicKey = sshPublicKey + "/n"; - } - sshPublicKey = sshPublicKey + publicKey; - s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); - } - else s_logger.error("ssh key with the given name " + s_each.getName() + " does not exist"); + sshPublicKey = sshPublicKey + "/n"; + sshPublicKey = sshPublicKey + publicKey; + s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); } } - boolean result = resetVMSSHKeyInternal(vmId, sshPublicKey); + boolean result = resetVMSSHKeyInternal(vmId, sshPublicKey, keypairnames); if (!result) { throw new CloudRuntimeException("Failed to reset SSH Key for the virtual machine "); @@ -915,7 +918,7 @@ protected void removeEncryptedPasswordFromUserVmVoDetails(UserVmVO userVmVo) { _vmDao.saveDetails(userVmVo); } - private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey) throws ResourceUnavailableException, InsufficientCapacityException { + private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String keypairnames) throws ResourceUnavailableException, InsufficientCapacityException { Long userId = CallContext.current().getCallingUserId(); VMInstanceVO vmInstance = _vmDao.findById(vmId); @@ -948,6 +951,8 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey) throws Res userVm.setDetail(VmDetailConstants.SSH_PUBLIC_KEY, sshPublicKey); _vmDao.saveDetails(userVm); + userVmDetailsDao.addDetail(vmId, ApiConstants.SSH_KEYPAIRS, keypairnames, true); + if (vmInstance.getState() == State.Stopped) { s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset"); return true; From 689f8247b545ef03276ca82215449f182b65483f Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 16 Jul 2021 15:41:46 +0530 Subject: [PATCH 16/45] commit first eval --- .../java/com/cloud/vm/VmDetailConstants.java | 1 + .../api/response/UserVmResponse.java | 14 +- .../com/cloud/user/dao/SSHKeyPairDaoImpl.java | 1 - .../META-INF/db/schema-41510to41600.sql | 177 ++++++++++++++++++ .../com/cloud/api/query/QueryManagerImpl.java | 6 +- .../api/query/dao/UserVmJoinDaoImpl.java | 7 +- .../com/cloud/api/query/vo/UserVmJoinVO.java | 7 - .../java/com/cloud/vm/UserVmManagerImpl.java | 3 +- 8 files changed, 192 insertions(+), 24 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java index 5784ff110bf4..95ee7b38e0a1 100644 --- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java +++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java @@ -68,4 +68,5 @@ public interface VmDetailConstants { String DISK_OFFERING = "diskOffering"; String DEPLOY_AS_IS_CONFIGURATION = "configurationId"; + String KEY_PAIR_NAMES = "keypairnames"; } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java index de59ad1ff601..cb0d6fa0cc72 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java @@ -274,9 +274,9 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co @Param(description = "List of read-only Vm details as comma separated string.", since = "4.16.0") private String readOnlyDetails; - @SerializedName(ApiConstants.SSH_KEYPAIRS) - @Param(description = "ssh key-pairs") - private String keyPairNames; + @SerializedName(ApiConstants.SSH_KEYPAIR) + @Param(description = "ssh key-pair") + private String keyPairName; @SerializedName("affinitygroup") @Param(description = "list of affinity groups associated with the virtual machine", responseObject = AffinityGroupResponse.class) @@ -570,8 +570,8 @@ public String getInstanceName() { return instanceName; } - public String getKeyPairNames() { - return keyPairNames; + public String getKeyPairName() { + return keyPairName; } public Set getAffinityGroupList() { @@ -830,8 +830,8 @@ public void setTags(Set tags) { this.tags = tags; } - public void setKeyPairNames(String keyPairNames) { - this.keyPairNames = keyPairNames; + public void setKeyPairName(String keyPairName) { + this.keyPairName = keyPairName; } public void setAffinityGroupList(Set affinityGroups) { diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java index cd5c54595ea0..18d6a66db1bd 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -16,7 +16,6 @@ // under the License. package com.cloud.user.dao; -import java.util.ArrayList; import java.util.List; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql index ad13853fc1f4..aefa1077213a 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql @@ -511,3 +511,180 @@ CREATE VIEW `cloud`.`host_view` AS `cloud`.`user` ON `user`.`uuid` = `last_annotation_view`.`user_uuid` GROUP BY `host`.`id`; + +DROP VIEW IF EXISTS `cloud`.`user_vm_view`; +CREATE +VIEW `user_vm_view` AS + SELECT + `vm_instance`.`id` AS `id`, + `vm_instance`.`name` AS `name`, + `user_vm`.`display_name` AS `display_name`, + `user_vm`.`user_data` AS `user_data`, + `account`.`id` AS `account_id`, + `account`.`uuid` AS `account_uuid`, + `account`.`account_name` AS `account_name`, + `account`.`type` AS `account_type`, + `domain`.`id` AS `domain_id`, + `domain`.`uuid` AS `domain_uuid`, + `domain`.`name` AS `domain_name`, + `domain`.`path` AS `domain_path`, + `projects`.`id` AS `project_id`, + `projects`.`uuid` AS `project_uuid`, + `projects`.`name` AS `project_name`, + `instance_group`.`id` AS `instance_group_id`, + `instance_group`.`uuid` AS `instance_group_uuid`, + `instance_group`.`name` AS `instance_group_name`, + `vm_instance`.`uuid` AS `uuid`, + `vm_instance`.`user_id` AS `user_id`, + `vm_instance`.`last_host_id` AS `last_host_id`, + `vm_instance`.`vm_type` AS `type`, + `vm_instance`.`limit_cpu_use` AS `limit_cpu_use`, + `vm_instance`.`created` AS `created`, + `vm_instance`.`state` AS `state`, + `vm_instance`.`removed` AS `removed`, + `vm_instance`.`ha_enabled` AS `ha_enabled`, + `vm_instance`.`hypervisor_type` AS `hypervisor_type`, + `vm_instance`.`instance_name` AS `instance_name`, + `vm_instance`.`guest_os_id` AS `guest_os_id`, + `vm_instance`.`display_vm` AS `display_vm`, + `guest_os`.`uuid` AS `guest_os_uuid`, + `vm_instance`.`pod_id` AS `pod_id`, + `host_pod_ref`.`uuid` AS `pod_uuid`, + `vm_instance`.`private_ip_address` AS `private_ip_address`, + `vm_instance`.`private_mac_address` AS `private_mac_address`, + `vm_instance`.`vm_type` AS `vm_type`, + `data_center`.`id` AS `data_center_id`, + `data_center`.`uuid` AS `data_center_uuid`, + `data_center`.`name` AS `data_center_name`, + `data_center`.`is_security_group_enabled` AS `security_group_enabled`, + `data_center`.`networktype` AS `data_center_type`, + `host`.`id` AS `host_id`, + `host`.`uuid` AS `host_uuid`, + `host`.`name` AS `host_name`, + `vm_template`.`id` AS `template_id`, + `vm_template`.`uuid` AS `template_uuid`, + `vm_template`.`name` AS `template_name`, + `vm_template`.`display_text` AS `template_display_text`, + `vm_template`.`enable_password` AS `password_enabled`, + `iso`.`id` AS `iso_id`, + `iso`.`uuid` AS `iso_uuid`, + `iso`.`name` AS `iso_name`, + `iso`.`display_text` AS `iso_display_text`, + `service_offering`.`id` AS `service_offering_id`, + `svc_disk_offering`.`uuid` AS `service_offering_uuid`, + `disk_offering`.`uuid` AS `disk_offering_uuid`, + `disk_offering`.`id` AS `disk_offering_id`, + (CASE + WHEN ISNULL(`service_offering`.`cpu`) THEN `custom_cpu`.`value` + ELSE `service_offering`.`cpu` + END) AS `cpu`, + (CASE + WHEN ISNULL(`service_offering`.`speed`) THEN `custom_speed`.`value` + ELSE `service_offering`.`speed` + END) AS `speed`, + (CASE + WHEN ISNULL(`service_offering`.`ram_size`) THEN `custom_ram_size`.`value` + ELSE `service_offering`.`ram_size` + END) AS `ram_size`, + `backup_offering`.`uuid` AS `backup_offering_uuid`, + `backup_offering`.`id` AS `backup_offering_id`, + `svc_disk_offering`.`name` AS `service_offering_name`, + `disk_offering`.`name` AS `disk_offering_name`, + `backup_offering`.`name` AS `backup_offering_name`, + `storage_pool`.`id` AS `pool_id`, + `storage_pool`.`uuid` AS `pool_uuid`, + `storage_pool`.`pool_type` AS `pool_type`, + `volumes`.`id` AS `volume_id`, + `volumes`.`uuid` AS `volume_uuid`, + `volumes`.`device_id` AS `volume_device_id`, + `volumes`.`volume_type` AS `volume_type`, + `security_group`.`id` AS `security_group_id`, + `security_group`.`uuid` AS `security_group_uuid`, + `security_group`.`name` AS `security_group_name`, + `security_group`.`description` AS `security_group_description`, + `nics`.`id` AS `nic_id`, + `nics`.`uuid` AS `nic_uuid`, + `nics`.`network_id` AS `network_id`, + `nics`.`ip4_address` AS `ip_address`, + `nics`.`ip6_address` AS `ip6_address`, + `nics`.`ip6_gateway` AS `ip6_gateway`, + `nics`.`ip6_cidr` AS `ip6_cidr`, + `nics`.`default_nic` AS `is_default_nic`, + `nics`.`gateway` AS `gateway`, + `nics`.`netmask` AS `netmask`, + `nics`.`mac_address` AS `mac_address`, + `nics`.`broadcast_uri` AS `broadcast_uri`, + `nics`.`isolation_uri` AS `isolation_uri`, + `vpc`.`id` AS `vpc_id`, + `vpc`.`uuid` AS `vpc_uuid`, + `networks`.`uuid` AS `network_uuid`, + `networks`.`name` AS `network_name`, + `networks`.`traffic_type` AS `traffic_type`, + `networks`.`guest_type` AS `guest_type`, + `user_ip_address`.`id` AS `public_ip_id`, + `user_ip_address`.`uuid` AS `public_ip_uuid`, + `user_ip_address`.`public_ip_address` AS `public_ip_address`, + `resource_tags`.`id` AS `tag_id`, + `resource_tags`.`uuid` AS `tag_uuid`, + `resource_tags`.`key` AS `tag_key`, + `resource_tags`.`value` AS `tag_value`, + `resource_tags`.`domain_id` AS `tag_domain_id`, + `domain`.`uuid` AS `tag_domain_uuid`, + `domain`.`name` AS `tag_domain_name`, + `resource_tags`.`account_id` AS `tag_account_id`, + `account`.`account_name` AS `tag_account_name`, + `resource_tags`.`resource_id` AS `tag_resource_id`, + `resource_tags`.`resource_uuid` AS `tag_resource_uuid`, + `resource_tags`.`resource_type` AS `tag_resource_type`, + `resource_tags`.`customer` AS `tag_customer`, + `async_job`.`id` AS `job_id`, + `async_job`.`uuid` AS `job_uuid`, + `async_job`.`job_status` AS `job_status`, + `async_job`.`account_id` AS `job_account_id`, + `affinity_group`.`id` AS `affinity_group_id`, + `affinity_group`.`uuid` AS `affinity_group_uuid`, + `affinity_group`.`name` AS `affinity_group_name`, + `affinity_group`.`description` AS `affinity_group_description`, + `vm_instance`.`dynamically_scalable` AS `dynamically_scalable` + FROM + (((((((((((((((((((((((((((((((((`user_vm` + JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) + AND ISNULL(`vm_instance`.`removed`)))) + JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) + JOIN `domain` ON ((`vm_instance`.`domain_id` = `domain`.`id`))) + LEFT JOIN `guest_os` ON ((`vm_instance`.`guest_os_id` = `guest_os`.`id`))) + LEFT JOIN `host_pod_ref` ON ((`vm_instance`.`pod_id` = `host_pod_ref`.`id`))) + LEFT JOIN `projects` ON ((`projects`.`project_account_id` = `account`.`id`))) + LEFT JOIN `instance_group_vm_map` ON ((`vm_instance`.`id` = `instance_group_vm_map`.`instance_id`))) + LEFT JOIN `instance_group` ON ((`instance_group_vm_map`.`group_id` = `instance_group`.`id`))) + LEFT JOIN `data_center` ON ((`vm_instance`.`data_center_id` = `data_center`.`id`))) + LEFT JOIN `host` ON ((`vm_instance`.`host_id` = `host`.`id`))) + LEFT JOIN `vm_template` ON ((`vm_instance`.`vm_template_id` = `vm_template`.`id`))) + LEFT JOIN `vm_template` `iso` ON ((`iso`.`id` = `user_vm`.`iso_id`))) + LEFT JOIN `service_offering` ON ((`vm_instance`.`service_offering_id` = `service_offering`.`id`))) + LEFT JOIN `disk_offering` `svc_disk_offering` ON ((`vm_instance`.`service_offering_id` = `svc_disk_offering`.`id`))) + LEFT JOIN `disk_offering` ON ((`vm_instance`.`disk_offering_id` = `disk_offering`.`id`))) + LEFT JOIN `backup_offering` ON ((`vm_instance`.`backup_offering_id` = `backup_offering`.`id`))) + LEFT JOIN `volumes` ON ((`vm_instance`.`id` = `volumes`.`instance_id`))) + LEFT JOIN `storage_pool` ON ((`volumes`.`pool_id` = `storage_pool`.`id`))) + LEFT JOIN `security_group_vm_map` ON ((`vm_instance`.`id` = `security_group_vm_map`.`instance_id`))) + LEFT JOIN `security_group` ON ((`security_group_vm_map`.`security_group_id` = `security_group`.`id`))) + LEFT JOIN `nics` ON (((`vm_instance`.`id` = `nics`.`instance_id`) + AND ISNULL(`nics`.`removed`)))) + LEFT JOIN `networks` ON ((`nics`.`network_id` = `networks`.`id`))) + LEFT JOIN `vpc` ON (((`networks`.`vpc_id` = `vpc`.`id`) + AND ISNULL(`vpc`.`removed`)))) + LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) + LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) + AND (`resource_tags`.`resource_type` = 'UserVm')))) + LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) + AND (`async_job`.`instance_type` = 'VirtualMachine') + AND (`async_job`.`job_status` = 0)))) + LEFT JOIN `affinity_group_vm_map` ON ((`vm_instance`.`id` = `affinity_group_vm_map`.`instance_id`))) + LEFT JOIN `affinity_group` ON ((`affinity_group_vm_map`.`affinity_group_id` = `affinity_group`.`id`))) + LEFT JOIN `user_vm_details` `custom_cpu` ON (((`custom_cpu`.`vm_id` = `vm_instance`.`id`) + AND (`custom_cpu`.`name` = 'CpuNumber')))) + LEFT JOIN `user_vm_details` `custom_speed` ON (((`custom_speed`.`vm_id` = `vm_instance`.`id`) + AND (`custom_speed`.`name` = 'CpuSpeed')))) + LEFT JOIN `user_vm_details` `custom_ram_size` ON (((`custom_ram_size`.`vm_id` = `vm_instance`.`id`) + AND (`custom_ram_size`.`name` = 'memory')))); diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 0c8a7f794355..9f4b74bc3781 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -992,9 +992,9 @@ private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cm sb.and("affinityGroupId", sb.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); } - if (keyPairName != null) { - sb.and("keyPairName", sb.entity().getKeypairName(), SearchCriteria.Op.EQ); - } + //if (keyPairName != null) { + // sb.and("keyPairName", sb.entity().getKeypairName(), SearchCriteria.Op.EQ); + //} if (!isRootAdmin) { sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index f679e1330686..4523b5387079 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -28,6 +28,7 @@ import javax.inject.Inject; +import com.cloud.vm.VmDetailConstants; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.VMDetails; @@ -324,10 +325,6 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us if (vmDetails != null) { Map resourceDetails = new HashMap(); for (UserVmDetailVO userVmDetailVO : vmDetails) { - if (userVmDetailVO.getName() == ApiConstants.SSH_KEYPAIRS) { - userVmResponse.setKeyPairNames(userVmDetailVO.getValue()); - continue; - } if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) || (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES))) { resourceDetails.put(userVmDetailVO.getName(), userVmDetailVO.getValue()); @@ -367,6 +364,8 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us userVmResponse.setDynamicallyScalable(userVm.isDynamicallyScalable()); } + userVmResponse.setKeyPairName(userVm.getDetail(VmDetailConstants.KEY_PAIR_NAMES)); + return userVmResponse; } diff --git a/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java index 6d48bec716be..eaa4c9a9bb98 100644 --- a/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java @@ -344,9 +344,6 @@ public class UserVmJoinVO extends BaseViewWithTagInformationVO implements Contro @Column(name = "project_name") private String projectName; - @Column(name = "keypair_name") - private String keypairName; - @Column(name = "job_id") private Long jobId; @@ -754,10 +751,6 @@ public String getProjectName() { return projectName; } - public String getKeypairName() { - return keypairName; - } - public boolean isLimitCpuUse() { return limitCpuUse; } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index bd1e763f0562..5b8d8443f5dc 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -949,10 +949,9 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String key final UserVmVO userVm = _vmDao.findById(vmId); _vmDao.loadDetails(userVm); userVm.setDetail(VmDetailConstants.SSH_PUBLIC_KEY, sshPublicKey); + userVm.setDetail(VmDetailConstants.KEY_PAIR_NAMES, keypairnames); _vmDao.saveDetails(userVm); - userVmDetailsDao.addDetail(vmId, ApiConstants.SSH_KEYPAIRS, keypairnames, true); - if (vmInstance.getState() == State.Stopped) { s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset"); return true; From 48be6cf92fa0a7def9caad7f1779ed86b8c59277 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Tue, 20 Jul 2021 12:46:21 +0530 Subject: [PATCH 17/45] deploy vm takes multiple ssh-keys --- .../main/java/com/cloud/vm/UserVmService.java | 6 +- .../api/command/user/vm/DeployVMCmd.java | 7 ++ .../api/response/UserVmResponse.java | 14 ++-- .../com/cloud/user/dao/SSHKeyPairDao.java | 3 +- ...esClusterResourceModifierActionWorker.java | 3 +- .../KubernetesClusterStartWorker.java | 4 +- .../api/query/dao/UserVmJoinDaoImpl.java | 6 +- .../network/as/AutoScaleManagerImpl.java | 6 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 80 ++++++++++++------- 9 files changed, 82 insertions(+), 47 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java b/api/src/main/java/com/cloud/vm/UserVmService.java index 0b48a4867c00..411a2407638a 100644 --- a/api/src/main/java/com/cloud/vm/UserVmService.java +++ b/api/src/main/java/com/cloud/vm/UserVmService.java @@ -215,7 +215,7 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E */ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, - String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard, + String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameter, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, @@ -297,7 +297,7 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s */ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, - HTTPMethod httpmethod, String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, + HTTPMethod httpmethod, String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, @@ -377,7 +377,7 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin */ UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, - String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, + String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map templateOvfPropertiesMap, boolean dynamicScalingEnabled) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 733bddb45149..b22eb9ca064d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -156,6 +156,9 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pair used to login to the virtual machine") private String sshKeyPairName; + @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") + private List sshKeyPairNames; + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, description = "destination Host ID to deploy the VM to - parameter available for root admin only") private Long hostId; @@ -438,6 +441,10 @@ public String getSSHKeyPairName() { return sshKeyPairName; } + public List getSSHKeyPairNames() { + return sshKeyPairNames; + } + public Long getHostId() { return hostId; } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java index cb0d6fa0cc72..de59ad1ff601 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java @@ -274,9 +274,9 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co @Param(description = "List of read-only Vm details as comma separated string.", since = "4.16.0") private String readOnlyDetails; - @SerializedName(ApiConstants.SSH_KEYPAIR) - @Param(description = "ssh key-pair") - private String keyPairName; + @SerializedName(ApiConstants.SSH_KEYPAIRS) + @Param(description = "ssh key-pairs") + private String keyPairNames; @SerializedName("affinitygroup") @Param(description = "list of affinity groups associated with the virtual machine", responseObject = AffinityGroupResponse.class) @@ -570,8 +570,8 @@ public String getInstanceName() { return instanceName; } - public String getKeyPairName() { - return keyPairName; + public String getKeyPairNames() { + return keyPairNames; } public Set getAffinityGroupList() { @@ -830,8 +830,8 @@ public void setTags(Set tags) { this.tags = tags; } - public void setKeyPairName(String keyPairName) { - this.keyPairName = keyPairName; + public void setKeyPairNames(String keyPairNames) { + this.keyPairNames = keyPairNames; } public void setAffinityGroupList(Set affinityGroups) { diff --git a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java index ec3e87004342..b9941dc16f7c 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/SSHKeyPairDao.java @@ -37,5 +37,6 @@ public interface SSHKeyPairDao extends GenericDao { public SSHKeyPairVO findByPublicKey(long accountId, long domainId, String publicKey); - List findByNames(long accountId, long domainId, List names); + public List findByNames(long accountId, long domainId, List names); + } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java index e60807ec56d7..2d840daf5e63 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java @@ -373,8 +373,7 @@ protected UserVm createKubernetesNode(String joinIp, int nodeInstance) throws Ma String base64UserData = Base64.encodeBase64String(k8sNodeConfig.getBytes(StringUtils.getPreferredCharset())); nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, - Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), - null, addrs, null, null, null, customParameterMap, null, null, null, null, true); + Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, null, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created node VM : %s, %s in the Kubernetes cluster : %s", hostName, nodeVm.getUuid(), kubernetesCluster.getName())); } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java index 9a30fdd82357..9aceafbefb29 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java @@ -210,7 +210,7 @@ private UserVm createKubernetesControlNode(final Network network, String serverI String base64UserData = Base64.encodeBase64String(k8sControlNodeConfig.getBytes(StringUtils.getPreferredCharset())); controlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, - Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), + Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created control VM ID: %s, %s in the Kubernetes cluster : %s", controlVm.getUuid(), hostName, kubernetesCluster.getName())); @@ -265,7 +265,7 @@ private UserVm createKubernetesAdditionalControlNode(final String joinIp, final additionalControlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), - null, addrs, null, null, null, customParameterMap, null, null, null, null, true); + null, null, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created control VM ID : %s, %s in the Kubernetes cluster : %s", additionalControlVm.getUuid(), hostName, kubernetesCluster.getName())); } diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 4523b5387079..2a9916001b33 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -325,6 +325,10 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us if (vmDetails != null) { Map resourceDetails = new HashMap(); for (UserVmDetailVO userVmDetailVO : vmDetails) { + if (userVmDetailVO.getName().startsWith(VmDetailConstants.KEY_PAIR_NAMES)) { + s_logger.info(userVmDetailVO.getValue()); + userVmResponse.setKeyPairNames(userVmDetailVO.getValue()); + } if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) || (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES))) { resourceDetails.put(userVmDetailVO.getName(), userVmDetailVO.getValue()); @@ -364,8 +368,6 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us userVmResponse.setDynamicallyScalable(userVm.isDynamicallyScalable()); } - userVmResponse.setKeyPairName(userVm.getDetail(VmDetailConstants.KEY_PAIR_NAMES)); - return userVmResponse; } diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 5e7f0a952643..6894019a5b48 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1324,19 +1324,19 @@ private long createNewVM(AutoScaleVmGroupVO asGroup) { if (zone.getNetworkType() == NetworkType.Basic) { vm = _userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), - "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, + "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, null, null, true, null, null, null, null, null, null, null, true); } else { if (zone.isSecurityGroupEnabled()) { vm = _userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, null, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, - null, null, true, null, null, null, null, null, null, null, true); + null, null, null, true, null, null, null, null, null, null, null, true); } else { vm = _userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), - null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, addrs, true, null, null, null, null, null, null, null, true); + null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null,null, addrs, true, null, null, null, null, null, null, null, true); } } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 5b8d8443f5dc..6605554a5ba9 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -859,7 +859,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce throw new InvalidParameterValueException("No keypair name given"); } - String keypairnames = null; + String keypairnames = ""; SSHKeyPairVO s = null; if (cmd.getName() != null) { s = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), cmd.getName()); @@ -870,13 +870,12 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce if (cmd.getNames() != null) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); for (String keypairname : cmd.getNames()) { - if (keypairnames != null) { + if (keypairnames != "") { keypairnames = keypairnames + ", "; } keypairnames = keypairnames + keypairname; } } - if (s_list == null && s == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + " in specified domain id"); @@ -884,19 +883,20 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce _accountMgr.checkAccess(caller, null, true, userVm); - String sshPublicKey = null; + String sshPublicKey = ""; if (s != null) { sshPublicKey = s.getPublicKey(); + sshPublicKey = sshPublicKey + "/n"; s_logger.info("the public key for single ssh is " + sshPublicKey); } if (s_list != null) { for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); - sshPublicKey = sshPublicKey + "/n"; sshPublicKey = sshPublicKey + publicKey; - s_logger.info("the public key for keypair name " + s_each.getName() + " is " + sshPublicKey); + sshPublicKey = sshPublicKey + "/n"; + s_logger.info("the public key for keypair name " + s_each.getName() + " is " + publicKey); } } @@ -940,7 +940,6 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String key throw new CloudRuntimeException("Can't find network element for " + Service.UserData.getName() + " provider needed for SSH Key reset"); } boolean result = element.saveSSHKey(defaultNetwork, defaultNicProfile, vmProfile, sshPublicKey); - // Need to reboot the virtual machine so that the password gets redownloaded from the DomR, and reset on the VM if (!result) { s_logger.debug("Failed to reset SSH Key for the virtual machine; no need to reboot the vm"); @@ -3284,7 +3283,7 @@ private boolean validPassword(String password) { @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, - String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, + String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParametes, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3334,7 +3333,7 @@ public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOff } return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod, - userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId, dhcpOptionMap, + userData, sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } @@ -3343,7 +3342,7 @@ public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOff @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, - HTTPMethod httpmethod, String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, + HTTPMethod httpmethod, String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3445,7 +3444,7 @@ public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, Service } return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod, - userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, + userData, sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } @@ -3453,7 +3452,7 @@ public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, Service @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, - String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayvm, String keyboard, List affinityGroupIdList, + String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayvm, String keyboard, List affinityGroupIdList, Map customParametrs, String customId, Map> dhcpOptionsMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFPropertiesMap, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3504,9 +3503,8 @@ public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serv } } verifyExtraDhcpOptionsNetwork(dhcpOptionsMap, networkList); - return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, null, group, httpmethod, userData, - sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId, dhcpOptionsMap, + sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId, dhcpOptionsMap, dataDiskTemplateToDiskOfferingMap, userVmOVFPropertiesMap, dynamicScalingEnabled); } @@ -3623,7 +3621,7 @@ public void checkNameForRFCCompliance(String name) { @DB private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate tmplt, String hostName, String displayName, Account owner, Long diskOfferingId, Long diskSize, List networkList, List securityGroupIdList, String group, HTTPMethod httpmethod, String userData, - String sshKeyPair, HypervisorType hypervisor, Account caller, Map requestedIps, IpAddresses defaultIps, Boolean isDisplayVm, String keyboard, + String sshKeyPair, List sshKeyPairs, HypervisorType hypervisor, Account caller, Map requestedIps, IpAddresses defaultIps, Boolean isDisplayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map datadiskTemplateToDiskOfferringMap, Map userVmOVFPropertiesMap, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ResourceUnavailableException, @@ -3818,17 +3816,40 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe // check if the user data is correct userData = validateUserData(userData, httpmethod); - // Find an SSH public key corresponding to the key pair name, if one is // given - String sshPublicKey = null; + String sshPublicKey = ""; + String keypairnames = ""; if (sshKeyPair != null && !sshKeyPair.equals("")) { + s_logger.info("keypair name is " + sshKeyPair); SSHKeyPair pair = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPair); if (pair == null) { - throw new InvalidParameterValueException("A key pair with name '" + sshKeyPair + "' was not found."); + throw new InvalidParameterValueException("A key pair with name '" + pair.getName() + "' was not found."); } + sshPublicKey = sshPublicKey + pair.getPublicKey(); + sshPublicKey = sshPublicKey + "/n"; + keypairnames = keypairnames + sshKeyPair; + s_logger.info("publickey is " + sshPublicKey); + } - sshPublicKey = pair.getPublicKey(); + if (sshKeyPairs != null) { + for (String sshkeypair : sshKeyPairs) { + if (keypairnames != "") { + keypairnames = keypairnames + ", "; + } + keypairnames = keypairnames + sshkeypair; + } + List pairs = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), sshKeyPairs); + for (SSHKeyPairVO pair : pairs) { + if (pair == null) { + throw new InvalidParameterValueException("A key pair with name '" + pair.getName() + "' was not found."); + } + else { + s_logger.info("publickey is " + pair.getPublicKey()); + sshPublicKey = sshPublicKey + pair.getPublicKey(); + sshPublicKey = sshPublicKey + "/n"; + } + } } LinkedHashMap> networkNicMap = new LinkedHashMap<>(); @@ -3990,7 +4011,7 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe UserVmVO vm = commitUserVm(zone, template, hostName, displayName, owner, diskOfferingId, diskSize, userData, caller, isDisplayVm, keyboard, accountId, userId, offering, isIso, sshPublicKey, networkNicMap, id, instanceName, uuidName, hypervisorType, customParameters, dhcpOptionMap, - datadiskTemplateToDiskOfferringMap, userVmOVFPropertiesMap, dynamicScalingEnabled); + datadiskTemplateToDiskOfferringMap, userVmOVFPropertiesMap, dynamicScalingEnabled, keypairnames); // Assign instance to the group try { @@ -4102,7 +4123,7 @@ private UserVmVO commitUserVm(final boolean isImport, final DataCenter zone, fin final long accountId, final long userId, final ServiceOffering offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap> networkNicMap, final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map customParameters, final Map> extraDhcpOptionMap, final Map dataDiskTemplateToDiskOfferingMap, - final Map userVmOVFPropertiesMap, final VirtualMachine.PowerState powerState, final boolean dynamicScalingEnabled) throws InsufficientCapacityException { + final Map userVmOVFPropertiesMap, final VirtualMachine.PowerState powerState, final boolean dynamicScalingEnabled, String sshkeypairs) throws InsufficientCapacityException { return Transaction.execute(new TransactionCallbackWithException() { @Override public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException { @@ -4120,6 +4141,10 @@ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCap vm.setDetail(VmDetailConstants.SSH_PUBLIC_KEY, sshPublicKey); } + if (sshkeypairs != null) { + vm.setDetail(VmDetailConstants.KEY_PAIR_NAMES, sshkeypairs); + } + if (keyboard != null && !keyboard.isEmpty()) { vm.setDetail(VmDetailConstants.KEYBOARD, keyboard); } @@ -4294,13 +4319,13 @@ private UserVmVO commitUserVm(final DataCenter zone, final VirtualMachineTemplat final long accountId, final long userId, final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap> networkNicMap, final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map customParameters, final Map> extraDhcpOptionMap, final Map dataDiskTemplateToDiskOfferingMap, - Map userVmOVFPropertiesMap, final boolean dynamicScalingEnabled) throws InsufficientCapacityException { + Map userVmOVFPropertiesMap, final boolean dynamicScalingEnabled, String sshkeypairs) throws InsufficientCapacityException { return commitUserVm(false, zone, null, null, template, hostName, displayName, owner, diskOfferingId, diskSize, userData, caller, isDisplayVm, keyboard, accountId, userId, offering, isIso, sshPublicKey, networkNicMap, id, instanceName, uuidName, hypervisorType, customParameters, extraDhcpOptionMap, dataDiskTemplateToDiskOfferingMap, - userVmOVFPropertiesMap, null, dynamicScalingEnabled); + userVmOVFPropertiesMap, null, dynamicScalingEnabled, sshkeypairs); } public void validateRootDiskResize(final HypervisorType hypervisorType, Long rootDiskSize, VMTemplateVO templateVO, UserVmVO vm, final Map customParameters) throws InvalidParameterValueException @@ -5453,6 +5478,7 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE String group = cmd.getGroup(); String userData = cmd.getUserData(); String sshKeyPairName = cmd.getSSHKeyPairName(); + List sshKeyPairNames = cmd.getSSHKeyPairNames(); Boolean displayVm = cmd.isDisplayVm(); String keyboard = cmd.getKeyboard(); Map dataDiskTemplateToDiskOfferingMap = cmd.getDataDiskTemplateToDiskOfferingMap(); @@ -5462,14 +5488,14 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Can't specify network Ids in Basic zone"); } else { vm = createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, getSecurityGroupIdList(cmd), owner, name, displayName, diskOfferingId, - size , group , cmd.getHypervisor(), cmd.getHttpMethod(), userData , sshKeyPairName , cmd.getIpToNetworkMap(), addrs, displayVm , keyboard , cmd.getAffinityGroupIdList(), + size , group , cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm , keyboard , cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } } else { if (zone.isSecurityGroupEnabled()) { vm = createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, networkIds, getSecurityGroupIdList(cmd), owner, name, - displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, + displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); @@ -5478,7 +5504,7 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Can't create vm with security groups; security group feature is not enabled per zone"); } vm = createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, name, displayName, diskOfferingId, size, group, - cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), + cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } } @@ -7568,7 +7594,7 @@ public UserVm importVM(final DataCenter zone, final Host host, final VirtualMach null, null, userData, caller, isDisplayVm, keyboard, accountId, userId, serviceOffering, template.getFormat().equals(ImageFormat.ISO), sshPublicKey, null, id, instanceName, uuidName, hypervisorType, customParameters, - null, null, null, powerState, dynamicScalingEnabled); + null, null, null, powerState, dynamicScalingEnabled, null); } @Override From 748b624a976d7e7baf43e621cf549e5b3ea750e8 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 30 Jul 2021 13:07:44 +0530 Subject: [PATCH 18/45] Deploy VM UI changed to accept multiple ssh keys --- .../main/java/com/cloud/vm/UserVmService.java | 6 +- .../api/command/user/vm/DeployVMCmd.java | 7 --- .../api/command/user/vm/ResetVMSSHKeyCmd.java | 7 --- ...esClusterResourceModifierActionWorker.java | 11 ++-- .../KubernetesClusterStartWorker.java | 10 +++- .../network/as/AutoScaleManagerImpl.java | 6 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 55 +++++-------------- ui/src/views/compute/DeployVM.vue | 31 ++++++----- .../compute/wizard/AffinityGroupSelection.vue | 1 + .../compute/wizard/SshKeyPairSelection.vue | 48 +++++----------- 10 files changed, 68 insertions(+), 114 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java b/api/src/main/java/com/cloud/vm/UserVmService.java index 411a2407638a..bc2d714e8baf 100644 --- a/api/src/main/java/com/cloud/vm/UserVmService.java +++ b/api/src/main/java/com/cloud/vm/UserVmService.java @@ -215,7 +215,7 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E */ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, - String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard, + String userData, List sshKeyPairs, Map requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameter, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, @@ -297,7 +297,7 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s */ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, - HTTPMethod httpmethod, String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, + HTTPMethod httpmethod, String userData, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, @@ -377,7 +377,7 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin */ UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, - String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, + List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map templateOvfPropertiesMap, boolean dynamicScalingEnabled) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index b22eb9ca064d..8f76363d3f45 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -153,9 +153,6 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.USER_DATA, type = CommandType.STRING, description = "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.", length = 32768) private String userData; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pair used to login to the virtual machine") - private String sshKeyPairName; - @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") private List sshKeyPairNames; @@ -437,10 +434,6 @@ public String getName() { return name; } - public String getSSHKeyPairName() { - return sshKeyPairName; - } - public List getSSHKeyPairNames() { return sshKeyPairNames; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index 3c76283b9773..f1f51ac87ea9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -60,9 +60,6 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = UserVmResponse.class, required = true, description = "The ID of the virtual machine") private Long id; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pair used to login to the virtual machine") - private String name; - @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs used to login to the virtual machine") List names; @@ -83,10 +80,6 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - public String getName() { - return name; - } - public List getNames() { return names; } public Long getId() { diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java index 2d840daf5e63..5ddcf9bcc95e 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java @@ -146,9 +146,10 @@ private String getKubernetesNodeConfig(final String joinIp, final boolean ejectI final String clusterTokenKey = "{{ k8s_control_node.cluster.token }}"; final String ejectIsoKey = "{{ k8s.eject.iso }}"; String pubKey = "- \"" + configurationDao.getValue("ssh.publickey") + "\""; - String sshKeyPair = kubernetesCluster.getKeyPair(); - if (!Strings.isNullOrEmpty(sshKeyPair)) { - SSHKeyPairVO sshkp = sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPair); + List sshKeyPairs = null; + sshKeyPairs.add(kubernetesCluster.getKeyPair()); + if (!Strings.isNullOrEmpty(sshKeyPairs.get(0))) { + SSHKeyPairVO sshkp = sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPairs.get(0)); if (sshkp != null) { pubKey += "\n - \"" + sshkp.getPublicKey() + "\""; } @@ -371,9 +372,11 @@ protected UserVm createKubernetesNode(String joinIp, int nodeInstance) throws Ma logAndThrow(Level.ERROR, "Failed to read Kubernetes node configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sNodeConfig.getBytes(StringUtils.getPreferredCharset())); + List keypairs = null; + keypairs.add(kubernetesCluster.getKeyPair()); nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, - Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, null, addrs, null, null, null, customParameterMap, null, null, null, null, true); + Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, keypairs, null, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created node VM : %s, %s in the Kubernetes cluster : %s", hostName, nodeVm.getUuid(), kubernetesCluster.getName())); } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java index 9aceafbefb29..2d06864aaa32 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java @@ -208,9 +208,11 @@ private UserVm createKubernetesControlNode(final Network network, String serverI logAndThrow(Level.ERROR, "Failed to read Kubernetes control node configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sControlNodeConfig.getBytes(StringUtils.getPreferredCharset())); + List keypairs = null; + keypairs.add(kubernetesCluster.getKeyPair()); controlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, - Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, + Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, keypairs, requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created control VM ID: %s, %s in the Kubernetes cluster : %s", controlVm.getUuid(), hostName, kubernetesCluster.getName())); @@ -262,10 +264,12 @@ private UserVm createKubernetesAdditionalControlNode(final String joinIp, final logAndThrow(Level.ERROR, "Failed to read Kubernetes control configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sControlNodeConfig.getBytes(StringUtils.getPreferredCharset())); + List keypairs = null; + keypairs.add(kubernetesCluster.getKeyPair()); additionalControlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, - Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), - null, null, addrs, null, null, null, customParameterMap, null, null, null, null, true); + Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, keypairs, + null, addrs, null, null, null, customParameterMap, null, null, null, null, true); if (LOGGER.isInfoEnabled()) { LOGGER.info(String.format("Created control VM ID : %s, %s in the Kubernetes cluster : %s", additionalControlVm.getUuid(), hostName, kubernetesCluster.getName())); } diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 6894019a5b48..42e08a52c89c 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1324,19 +1324,19 @@ private long createNewVM(AutoScaleVmGroupVO asGroup) { if (zone.getNetworkType() == NetworkType.Basic) { vm = _userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), - "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, null, + "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, null, true, null, null, null, null, null, null, null, true); } else { if (zone.isSecurityGroupEnabled()) { vm = _userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, null, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), - "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, + "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, null, true, null, null, null, null, null, null, null, true); } else { vm = _userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), - null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null,null, addrs, true, null, null, null, null, null, null, null, true); + null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null,null, addrs, true, null, null, null, null, null, null, null, true); } } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 48536cb1f1b1..e761f47a45e1 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -294,7 +294,6 @@ import com.cloud.user.AccountManager; import com.cloud.user.AccountService; import com.cloud.user.ResourceLimitService; -import com.cloud.user.SSHKeyPair; import com.cloud.user.SSHKeyPairVO; import com.cloud.user.User; import com.cloud.user.UserStatisticsVO; @@ -862,16 +861,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce throw new InvalidParameterValueException("Vm " + userVm + " should be stopped to do SSH Key reset"); } - if (cmd.getName() == null && cmd.getNames() == null) { - throw new InvalidParameterValueException("No keypair name given"); - } - String keypairnames = ""; - SSHKeyPairVO s = null; - if (cmd.getName() != null) { - s = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), cmd.getName()); - keypairnames = keypairnames + cmd.getName(); - } List s_list = null; if (cmd.getNames() != null) { @@ -883,7 +873,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce keypairnames = keypairnames + keypairname; } } - if (s_list == null && s == null) { + if (s_list == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + " in specified domain id"); } @@ -892,12 +882,6 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce String sshPublicKey = ""; - if (s != null) { - sshPublicKey = s.getPublicKey(); - sshPublicKey = sshPublicKey + "/n"; - s_logger.info("the public key for single ssh is " + sshPublicKey); - } - if (s_list != null) { for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); @@ -3286,7 +3270,7 @@ private boolean validPassword(String password) { @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, - String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, + String userData, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParametes, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3336,7 +3320,7 @@ public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOff } return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod, - userData, sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId, dhcpOptionMap, + userData, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } @@ -3345,7 +3329,7 @@ public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOff @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, - HTTPMethod httpmethod, String userData, String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, + HTTPMethod httpmethod, String userData, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFProperties, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3447,7 +3431,7 @@ public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, Service } return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod, - userData, sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, + userData, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId, dhcpOptionMap, dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } @@ -3455,7 +3439,7 @@ public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, Service @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", create = true) public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, - String sshKeyPair, List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayvm, String keyboard, List affinityGroupIdList, + List sshKeyPairs, Map requestedIps, IpAddresses defaultIps, Boolean displayvm, String keyboard, List affinityGroupIdList, Map customParametrs, String customId, Map> dhcpOptionsMap, Map dataDiskTemplateToDiskOfferingMap, Map userVmOVFPropertiesMap, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException { @@ -3507,7 +3491,7 @@ public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serv } verifyExtraDhcpOptionsNetwork(dhcpOptionsMap, networkList); return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, null, group, httpmethod, userData, - sshKeyPair, sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId, dhcpOptionsMap, + sshKeyPairs, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId, dhcpOptionsMap, dataDiskTemplateToDiskOfferingMap, userVmOVFPropertiesMap, dynamicScalingEnabled); } @@ -3624,7 +3608,7 @@ public void checkNameForRFCCompliance(String name) { @DB private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate tmplt, String hostName, String displayName, Account owner, Long diskOfferingId, Long diskSize, List networkList, List securityGroupIdList, String group, HTTPMethod httpmethod, String userData, - String sshKeyPair, List sshKeyPairs, HypervisorType hypervisor, Account caller, Map requestedIps, IpAddresses defaultIps, Boolean isDisplayVm, String keyboard, + List sshKeyPairs, HypervisorType hypervisor, Account caller, Map requestedIps, IpAddresses defaultIps, Boolean isDisplayVm, String keyboard, List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, Map datadiskTemplateToDiskOfferringMap, Map userVmOVFPropertiesMap, boolean dynamicScalingEnabled) throws InsufficientCapacityException, ResourceUnavailableException, @@ -3823,17 +3807,6 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe // given String sshPublicKey = ""; String keypairnames = ""; - if (sshKeyPair != null && !sshKeyPair.equals("")) { - s_logger.info("keypair name is " + sshKeyPair); - SSHKeyPair pair = _sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPair); - if (pair == null) { - throw new InvalidParameterValueException("A key pair with name '" + pair.getName() + "' was not found."); - } - sshPublicKey = sshPublicKey + pair.getPublicKey(); - sshPublicKey = sshPublicKey + "/n"; - keypairnames = keypairnames + sshKeyPair; - s_logger.info("publickey is " + sshPublicKey); - } if (sshKeyPairs != null) { for (String sshkeypair : sshKeyPairs) { @@ -3848,12 +3821,15 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe throw new InvalidParameterValueException("A key pair with name '" + pair.getName() + "' was not found."); } else { - s_logger.info("publickey is " + pair.getPublicKey()); + s_logger.info("publickey is " + pair.getPublicKey()); sshPublicKey = sshPublicKey + pair.getPublicKey(); sshPublicKey = sshPublicKey + "/n"; } } } + else { + throw new InvalidParameterValueException("Keypairs was not found."); + } LinkedHashMap> networkNicMap = new LinkedHashMap<>(); @@ -5480,7 +5456,6 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE Long size = cmd.getSize(); String group = cmd.getGroup(); String userData = cmd.getUserData(); - String sshKeyPairName = cmd.getSSHKeyPairName(); List sshKeyPairNames = cmd.getSSHKeyPairNames(); Boolean displayVm = cmd.isDisplayVm(); String keyboard = cmd.getKeyboard(); @@ -5491,14 +5466,14 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Can't specify network Ids in Basic zone"); } else { vm = createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, getSecurityGroupIdList(cmd), owner, name, displayName, diskOfferingId, - size , group , cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm , keyboard , cmd.getAffinityGroupIdList(), + size , group , cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm , keyboard , cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } } else { if (zone.isSecurityGroupEnabled()) { vm = createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, networkIds, getSecurityGroupIdList(cmd), owner, name, - displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, + displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); @@ -5507,7 +5482,7 @@ public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Can't create vm with security groups; security group feature is not enabled per zone"); } vm = createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, name, displayName, diskOfferingId, size, group, - cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), + cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairNames, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties, dynamicScalingEnabled); } } diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index 5734f6df9656..97f1a2e735b5 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -356,7 +356,7 @@ :items="options.sshKeyPairs" :row-count="rowCount.sshKeyPairs" :zoneId="zoneId" - :value="sshKeyPair ? sshKeyPair.name : ''" + :value="keyPairs" :loading="loading.sshKeyPairs" :preFillContent="dataPreFill" @select-ssh-key-pair-item="($event) => updateSshKeyPairs($event)" @@ -702,7 +702,7 @@ export default { templateid: null, templatename: null, keyboard: null, - keypair: null, + keypairs: [], group: null, affinitygroupids: [], affinitygroup: [], @@ -764,7 +764,7 @@ export default { networks: [], networksAdd: [], zone: {}, - sshKeyPair: {}, + sshKeyPairs: [], templateFilter: [ 'featured', 'community', @@ -826,6 +826,9 @@ export default { affinityGroupIds () { return _.map(this.affinityGroups, 'id') }, + keyPairs () { + return _.map(this.sshKeyPairs, 'name') + }, params () { return { serviceOfferings: { @@ -1049,7 +1052,7 @@ export default { this.zone = _.find(this.options.zones, (option) => option.id === instanceConfig.zoneid) this.affinityGroups = _.filter(this.options.affinityGroups, (option) => _.includes(instanceConfig.affinitygroupids, option.id)) this.networks = _.filter(this.options.networks, (option) => _.includes(instanceConfig.networkids, option.id)) - this.sshKeyPair = _.find(this.options.sshKeyPairs, (option) => option.name === instanceConfig.keypair) + this.sshKeyPairs = _.filter(this.options.sshKeyPairs, (option) => _.includes(instanceConfig.keypairs, option.name)) if (this.zone) { this.vm.zoneid = this.zone.id @@ -1127,6 +1130,10 @@ export default { if (this.affinityGroups) { this.vm.affinitygroup = this.affinityGroups } + if (this.sshKeyPairs) { + console.log(this.sshKeyPairs) + this.vm.keypairs = this.sshKeyPairs.map((sshKeyPair) => { return sshKeyPair.name }) + } } }, serviceOffering (oldValue, newValue) { @@ -1164,7 +1171,7 @@ export default { this.form.getFieldDecorator('affinitygroupids', { initialValue: [], preserve: true }) this.form.getFieldDecorator('networkids', { initialValue: [], preserve: true }) this.form.getFieldDecorator('defaultnetworkid', { initialValue: undefined, preserve: true }) - this.form.getFieldDecorator('keypair', { initialValue: undefined, preserve: true }) + this.form.getFieldDecorator('keypairs', { initialValue: [], preserve: true }) this.form.getFieldDecorator('cpunumber', { initialValue: undefined, preserve: true }) this.form.getFieldDecorator('cpuSpeed', { initialValue: undefined, preserve: true }) this.form.getFieldDecorator('memory', { initialValue: undefined, preserve: true }) @@ -1402,15 +1409,9 @@ export default { updateNetworkConfig (networks) { this.networkConfig = networks }, - updateSshKeyPairs (name) { - if (name === this.$t('label.noselect')) { - this.form.setFieldsValue({ - keypair: undefined - }) - return - } + updateSshKeyPairs (names) { this.form.setFieldsValue({ - keypair: name + keypairs: names }) }, escapePropertyKey (key) { @@ -1608,7 +1609,9 @@ export default { } } // step 7: select ssh key pair - deployVmData.keypair = values.keypair + const KEYPAIRS = values.keypairs.map((keypair) => { return keypair.name }) + deployVmData.keypairs = KEYPAIRS.join(',') + // deployVmData.keypairs = values.keypairs.map((keypair) => { return keypair.name }) if (values.name) { deployVmData.name = values.name deployVmData.displayname = values.name diff --git a/ui/src/views/compute/wizard/AffinityGroupSelection.vue b/ui/src/views/compute/wizard/AffinityGroupSelection.vue index e3ce1c7403a0..1ac26dfc8458 100644 --- a/ui/src/views/compute/wizard/AffinityGroupSelection.vue +++ b/ui/src/views/compute/wizard/AffinityGroupSelection.vue @@ -116,6 +116,7 @@ export default { selectedRowKeys: this.selectedRowKeys, onChange: (rows) => { this.$emit('select-affinity-group-item', rows) + console.table(this.items) } } } diff --git a/ui/src/views/compute/wizard/SshKeyPairSelection.vue b/ui/src/views/compute/wizard/SshKeyPairSelection.vue index 222868e0e169..85357a54f031 100644 --- a/ui/src/views/compute/wizard/SshKeyPairSelection.vue +++ b/ui/src/views/compute/wizard/SshKeyPairSelection.vue @@ -26,14 +26,11 @@ :loading="loading" :columns="columns" :dataSource="tableSource" - :rowSelection="rowSelection" - :customRow="onClickRow" :pagination="false" + :rowSelection="rowSelection" size="middle" :scroll="{ y: 225 }" > - -
0 }, value: { - type: String, - default: '' + type: Array, + default: () => [] }, loading: { type: Boolean, @@ -103,8 +100,7 @@ export default { width: '30%' } ], - selectedRowKeys: [this.$t('label.noselect')], - dataItems: [], + selectedRowKeys: [], oldZoneId: null, options: { page: 1, @@ -116,7 +112,6 @@ export default { computed: { tableSource () { const dataItems = [] - if (this.options.page === 1) { dataItems.push({ key: this.$t('label.noselect'), @@ -125,7 +120,6 @@ export default { domain: '-' }) } - this.items.map((item) => { dataItems.push({ key: item.name, @@ -134,14 +128,16 @@ export default { domain: item.domain }) }) - + console.table(dataItems) return dataItems }, rowSelection () { return { - type: 'radio', - selectedRowKeys: this.selectedRowKeys, - onChange: this.onSelectRow + type: 'checkbox', + onChange: (selectedRowKeys, selectedRows) => { + console.table(selectedRowKeys) + this.$emit('select-ssh-key-pair-item', selectedRows) + } } } }, @@ -153,25 +149,21 @@ export default { }, loading () { if (!this.loading) { - if (this.preFillContent.keypair) { - this.selectedRowKeys = [this.preFillContent.keypair] - this.$emit('select-ssh-key-pair-item', this.preFillContent.keypair) + if (this.preFillContent.keypairs) { + this.selectedRowKeys = this.preFillContent.keypairs + this.$emit('select-ssh-key-pair-item', this.selectedRowKeys) } else { if (this.oldZoneId === this.zoneId) { return } this.oldZoneId = this.zoneId - this.selectedRowKeys = [this.$t('label.noselect')] - this.$emit('select-ssh-key-pair-item', this.$t('label.noselect')) + this.selectedRowKeys = [] + this.$emit('select-ssh-key-pair-item', this.selectedRowKeys) } } } }, methods: { - onSelectRow (value) { - this.selectedRowKeys = value - this.$emit('select-ssh-key-pair-item', value[0]) - }, handleSearch (value) { this.filter = value this.options.page = 1 @@ -188,16 +180,6 @@ export default { this.options.page = page this.options.pageSize = pageSize this.$emit('handle-search-filter', this.options) - }, - onClickRow (record) { - return { - on: { - click: () => { - this.selectedRowKeys = [record.key] - this.$emit('select-ssh-key-pair-item', record.key) - } - } - } } } } From 24bdc35a0903f27305dfd3d0e87bae67de4c2a86 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 6 Aug 2021 17:20:58 +0530 Subject: [PATCH 19/45] Reset SSH UI API changed --- .../api/command/user/vm/DeployVMCmd.java | 4 +++ .../api/command/user/vm/ResetVMSSHKeyCmd.java | 10 +++++-- .../main/java/com/cloud/vm/VMInstanceVO.java | 3 +-- .../java/com/cloud/vm/UserVmManagerImpl.java | 14 ++++++---- ui/src/config/section/compute.js | 26 ++----------------- .../compute/wizard/SshKeyPairSelection.vue | 8 ------ 6 files changed, 24 insertions(+), 41 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 8f76363d3f45..57bb510a2710 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -153,6 +153,9 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.USER_DATA, type = CommandType.STRING, description = "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.", length = 32768) private String userData; + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") + private String sshKeyPairName; + @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") private List sshKeyPairNames; @@ -435,6 +438,7 @@ public String getName() { } public List getSSHKeyPairNames() { + if(sshKeyPairName != null) sshKeyPairNames.add(sshKeyPairName); return sshKeyPairNames; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index f1f51ac87ea9..28fe0eee04ee 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -60,7 +60,10 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = UserVmResponse.class, required = true, description = "The ID of the virtual machine") private Long id; - @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs used to login to the virtual machine") + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the ssh key pair to bt used to login to the virtual machine") + String name; + + @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs to be used to login to the virtual machine") List names; //Owner information @@ -80,7 +83,10 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - public List getNames() { return names; } + public List getNames() { + if (name != null && name != "") names.add(name); + return names; + } public Long getId() { return id; diff --git a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java index afc7134990c9..7ed429ef2759 100644 --- a/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java +++ b/engine/schema/src/main/java/com/cloud/vm/VMInstanceVO.java @@ -492,8 +492,7 @@ public Map getDetails() { public void setDetail(String name, String value) { assert (details != null) : "Did you forget to load the details?"; - - details.put(name, value); + this.details.put(name, value); } public void setDetails(Map details) { diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index e761f47a45e1..141e6e63fe42 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -841,7 +841,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce Account caller = CallContext.current().getCallingAccount(); Account owner = _accountMgr.finalizeOwner(caller, cmd.getAccountName(), cmd.getDomainId(), cmd.getProjectId()); Long vmId = cmd.getId(); - + UserVmVO userVm = _vmDao.findById(cmd.getId()); if (userVm == null) { throw new InvalidParameterValueException("unable to find a virtual machine by id" + cmd.getId()); @@ -886,20 +886,23 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce for (SSHKeyPairVO s_each : s_list) { String publicKey = s_each.getPublicKey(); sshPublicKey = sshPublicKey + publicKey; - sshPublicKey = sshPublicKey + "/n"; + sshPublicKey = sshPublicKey + "\n"; s_logger.info("the public key for keypair name " + s_each.getName() + " is " + publicKey); } } boolean result = resetVMSSHKeyInternal(vmId, sshPublicKey, keypairnames); + UserVmVO vm = _vmDao.findById(vmId); + _vmDao.loadDetails(vm); + _vmDao.saveDetails(vm); if (!result) { throw new CloudRuntimeException("Failed to reset SSH Key for the virtual machine "); } - removeEncryptedPasswordFromUserVmVoDetails(userVm); + removeEncryptedPasswordFromUserVmVoDetails(vm); - return userVm; + return vm; } protected void removeEncryptedPasswordFromUserVmVoDetails(UserVmVO userVmVo) { @@ -946,6 +949,7 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String key s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset"); return true; } + s_logger.info("bb " + userVm.getDetail(VmDetailConstants.KEY_PAIR_NAMES)); if (rebootVirtualMachine(userId, vmId, false, false) == null) { s_logger.warn("Failed to reboot the vm " + vmInstance); return false; @@ -3823,7 +3827,7 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe else { s_logger.info("publickey is " + pair.getPublicKey()); sshPublicKey = sshPublicKey + pair.getPublicKey(); - sshPublicKey = sshPublicKey + "/n"; + sshPublicKey = sshPublicKey + "\n"; } } } diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js index a07ed635ba7c..7e7ca37a688d 100644 --- a/ui/src/config/section/compute.js +++ b/ui/src/config/section/compute.js @@ -340,31 +340,9 @@ export default { message: 'message.desc.reset.ssh.key.pair', docHelp: 'adminguide/virtual_machines.html#resetting-ssh-keys', dataView: true, - args: ['keypair', 'account', 'domainid'], show: (record) => { return ['Stopped'].includes(record.state) }, - mapping: { - keypair: { - api: 'listSSHKeyPairs', - params: (record) => { return { account: record.account, domainid: record.domainid } } - }, - account: { - value: (record) => { return record.account } - }, - domainid: { - value: (record) => { return record.domainid } - } - }, - successMethod: (obj, result) => { - const vm = result.jobresult.virtualmachine || {} - if (result.jobstatus === 1 && vm.password) { - const name = vm.displayname || vm.name || vm.id - obj.$notification.success({ - message: `${obj.$t('label.reset.ssh.key.pair.on.vm')}: ` + name, - description: `${obj.$t('label.password.reset.confirm')}: ` + vm.password, - duration: 0 - }) - } - } + component: () => import('@/views/compute/ResetSSH'), + popup: true }, { api: 'assignVirtualMachine', diff --git a/ui/src/views/compute/wizard/SshKeyPairSelection.vue b/ui/src/views/compute/wizard/SshKeyPairSelection.vue index 85357a54f031..b537bf19d0a7 100644 --- a/ui/src/views/compute/wizard/SshKeyPairSelection.vue +++ b/ui/src/views/compute/wizard/SshKeyPairSelection.vue @@ -112,14 +112,6 @@ export default { computed: { tableSource () { const dataItems = [] - if (this.options.page === 1) { - dataItems.push({ - key: this.$t('label.noselect'), - name: this.$t('label.noselect'), - account: '-', - domain: '-' - }) - } this.items.map((item) => { dataItems.push({ key: item.name, From 7357d7a9909ddf45a0deeb9ffbc0861d88afc91a Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 6 Aug 2021 21:15:20 +0530 Subject: [PATCH 20/45] ResetSSH.vue --- ui/src/views/compute/ResetSSH.vue | 157 ++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 ui/src/views/compute/ResetSSH.vue diff --git a/ui/src/views/compute/ResetSSH.vue b/ui/src/views/compute/ResetSSH.vue new file mode 100644 index 000000000000..d60109764924 --- /dev/null +++ b/ui/src/views/compute/ResetSSH.vue @@ -0,0 +1,157 @@ +// 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. + + + + + + From a655d81f99dbc027a47c9044f2ee18ea2ebe1dc3 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 11 Aug 2021 12:30:46 +0530 Subject: [PATCH 21/45] ssh keys joined, ssh added in infocard --- .../api/command/user/vm/ResetVMSSHKeyCmd.java | 1 - .../java/com/cloud/vm/UserVmManagerImpl.java | 19 ++++--------------- ui/src/components/view/InfoCard.vue | 14 +++++++++++--- ui/src/views/AutogenView.vue | 1 + ui/src/views/compute/EditVM.vue | 3 +++ ui/src/views/compute/ResetSSH.vue | 11 +++++++---- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index 28fe0eee04ee..bbc85b40d6a4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -62,7 +62,6 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the ssh key pair to bt used to login to the virtual machine") String name; - @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs to be used to login to the virtual machine") List names; diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 141e6e63fe42..fabf33c7d1db 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -841,7 +841,6 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce Account caller = CallContext.current().getCallingAccount(); Account owner = _accountMgr.finalizeOwner(caller, cmd.getAccountName(), cmd.getDomainId(), cmd.getProjectId()); Long vmId = cmd.getId(); - UserVmVO userVm = _vmDao.findById(cmd.getId()); if (userVm == null) { throw new InvalidParameterValueException("unable to find a virtual machine by id" + cmd.getId()); @@ -864,15 +863,12 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce String keypairnames = ""; List s_list = null; + if (cmd.getNames() != null) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); - for (String keypairname : cmd.getNames()) { - if (keypairnames != "") { - keypairnames = keypairnames + ", "; - } - keypairnames = keypairnames + keypairname; - } + keypairnames = String.join(", ", cmd.getNames()); } + if (s_list == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + " in specified domain id"); @@ -895,7 +891,6 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce UserVmVO vm = _vmDao.findById(vmId); _vmDao.loadDetails(vm); - _vmDao.saveDetails(vm); if (!result) { throw new CloudRuntimeException("Failed to reset SSH Key for the virtual machine "); } @@ -949,7 +944,6 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String key s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset"); return true; } - s_logger.info("bb " + userVm.getDetail(VmDetailConstants.KEY_PAIR_NAMES)); if (rebootVirtualMachine(userId, vmId, false, false) == null) { s_logger.warn("Failed to reboot the vm " + vmInstance); return false; @@ -3813,12 +3807,7 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe String keypairnames = ""; if (sshKeyPairs != null) { - for (String sshkeypair : sshKeyPairs) { - if (keypairnames != "") { - keypairnames = keypairnames + ", "; - } - keypairnames = keypairnames + sshkeypair; - } + keypairnames = String.join(", ", sshKeyPairs); List pairs = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), sshKeyPairs); for (SSHKeyPairVO pair : pairs) { if (pair == null) { diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 57f8e6669cbe..1e1d483b77d8 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -346,11 +346,13 @@ {{ resource.group || resource.groupid }}
-
-
{{ $t('label.keypair') }}
+
+
{{ $t('SSH Key Pairs') }}
- {{ resource.keypair }} +
  • + {{ keypair }} +
  • @@ -798,6 +800,12 @@ export default { return this.resource.nic.filter(e => { return e.ip6address }).map(e => { return e.ip6address }).join(', ') } + return null + }, + keypairs () { + if (this.resource.keypairs && this.resource.keypairs !== '') { + return this.resource.keypairs.split(', ') + } return null } }, diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index 24a966d50777..e4ad2c0b0ec0 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -627,6 +627,7 @@ export default { }) }, fetchData (params = {}) { + console.log('fetch') if (this.$route.name === 'deployVirtualMachine') { return } diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue index 931787414284..2c3be768368d 100644 --- a/ui/src/views/compute/EditVM.vue +++ b/ui/src/views/compute/EditVM.vue @@ -122,6 +122,9 @@ export default { created () { this.fetchData() }, + destroyed () { + console.log('updated') + }, methods: { fetchData () { this.fetchOsTypes() diff --git a/ui/src/views/compute/ResetSSH.vue b/ui/src/views/compute/ResetSSH.vue index d60109764924..b8b1429c10f1 100644 --- a/ui/src/views/compute/ResetSSH.vue +++ b/ui/src/views/compute/ResetSSH.vue @@ -91,6 +91,9 @@ export default { created () { this.fetchData() }, + beforeUpdate () { + this.$emit('refresh-data') + }, methods: { fetchData () { this.loading = true @@ -122,9 +125,6 @@ export default { this.options.pageSize = pagination.pageSize this.fetchData() }, - closeAction () { - this.$emit('close-action') - }, handleSubmit () { if (this.loading) return this.loading = true @@ -141,7 +141,10 @@ export default { }).finally(() => { this.loading = false }) - window.location.reload() + console.log('api') + }, + closeAction () { + this.$emit('close-action') } } } From 1da700c0945d8e6ae93936892cfbe1171e8b65da Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Thu, 12 Aug 2021 18:05:41 +0530 Subject: [PATCH 22/45] changes made --- .../api/command/user/vm/ResetVMSSHKeyCmd.java | 1 + .../main/resources/META-INF/db/schema-41510to41600.sql | 3 +-- .../KubernetesClusterResourceModifierActionWorker.java | 6 +++--- .../actionworkers/KubernetesClusterStartWorker.java | 2 +- .../java/com/cloud/api/query/QueryManagerImpl.java | 4 ---- .../src/main/java/com/cloud/vm/UserVmManagerImpl.java | 10 ++++++++-- ui/src/views/AutogenView.vue | 1 - ui/src/views/compute/EditVM.vue | 3 --- ui/src/views/compute/ResetSSH.vue | 5 +---- 9 files changed, 15 insertions(+), 20 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index bbc85b40d6a4..b5abc95f3765 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -62,6 +62,7 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the ssh key pair to bt used to login to the virtual machine") String name; + @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs to be used to login to the virtual machine") List names; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql index 8239af32bb6f..fcb2ff236bb5 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql @@ -697,8 +697,7 @@ CREATE VIEW `cloud`.`host_view` AS `host`.`id`; DROP VIEW IF EXISTS `cloud`.`user_vm_view`; -CREATE -VIEW `user_vm_view` AS +CREATE VIEW `cloud`.`user_vm_view` AS SELECT `vm_instance`.`id` AS `id`, `vm_instance`.`name` AS `name`, diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java index 5ddcf9bcc95e..a23d361aa1f5 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java @@ -146,9 +146,9 @@ private String getKubernetesNodeConfig(final String joinIp, final boolean ejectI final String clusterTokenKey = "{{ k8s_control_node.cluster.token }}"; final String ejectIsoKey = "{{ k8s.eject.iso }}"; String pubKey = "- \"" + configurationDao.getValue("ssh.publickey") + "\""; - List sshKeyPairs = null; + List sshKeyPairs = new ArrayList(); sshKeyPairs.add(kubernetesCluster.getKeyPair()); - if (!Strings.isNullOrEmpty(sshKeyPairs.get(0))) { + if (!sshKeyPairs.isEmpty() && !Strings.isNullOrEmpty(sshKeyPairs.get(0))) { SSHKeyPairVO sshkp = sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPairs.get(0)); if (sshkp != null) { pubKey += "\n - \"" + sshkp.getPublicKey() + "\""; @@ -372,7 +372,7 @@ protected UserVm createKubernetesNode(String joinIp, int nodeInstance) throws Ma logAndThrow(Level.ERROR, "Failed to read Kubernetes node configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sNodeConfig.getBytes(StringUtils.getPreferredCharset())); - List keypairs = null; + List keypairs = new ArrayList(); keypairs.add(kubernetesCluster.getKeyPair()); nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java index 2d06864aaa32..b56d9011f4c4 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java @@ -264,7 +264,7 @@ private UserVm createKubernetesAdditionalControlNode(final String joinIp, final logAndThrow(Level.ERROR, "Failed to read Kubernetes control configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sControlNodeConfig.getBytes(StringUtils.getPreferredCharset())); - List keypairs = null; + List keypairs = new ArrayList(); keypairs.add(kubernetesCluster.getKeyPair()); additionalControlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 31d7c10fb80d..b88a5bc16148 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -997,10 +997,6 @@ private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cm sb.and("affinityGroupId", sb.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); } - //if (keyPairName != null) { - // sb.and("keyPairName", sb.entity().getKeypairName(), SearchCriteria.Op.EQ); - //} - if (!isRootAdmin) { sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index fabf33c7d1db..4dc822ed46a1 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -842,6 +842,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce Account owner = _accountMgr.finalizeOwner(caller, cmd.getAccountName(), cmd.getDomainId(), cmd.getProjectId()); Long vmId = cmd.getId(); UserVmVO userVm = _vmDao.findById(cmd.getId()); + if (userVm == null) { throw new InvalidParameterValueException("unable to find a virtual machine by id" + cmd.getId()); } @@ -862,10 +863,15 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce String keypairnames = ""; - List s_list = null; + List s_list = new ArrayList<>(); - if (cmd.getNames() != null) { + if (!cmd.getNames().isEmpty()) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); + for (SSHKeyPairVO s : s_list) { + if (s == null) { + throw new InvalidParameterValueException("Keypair given does not exist"); + } + } keypairnames = String.join(", ", cmd.getNames()); } diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index e4ad2c0b0ec0..24a966d50777 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -627,7 +627,6 @@ export default { }) }, fetchData (params = {}) { - console.log('fetch') if (this.$route.name === 'deployVirtualMachine') { return } diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue index 2c3be768368d..931787414284 100644 --- a/ui/src/views/compute/EditVM.vue +++ b/ui/src/views/compute/EditVM.vue @@ -122,9 +122,6 @@ export default { created () { this.fetchData() }, - destroyed () { - console.log('updated') - }, methods: { fetchData () { this.fetchOsTypes() diff --git a/ui/src/views/compute/ResetSSH.vue b/ui/src/views/compute/ResetSSH.vue index b8b1429c10f1..f3f9ce8950ee 100644 --- a/ui/src/views/compute/ResetSSH.vue +++ b/ui/src/views/compute/ResetSSH.vue @@ -91,9 +91,6 @@ export default { created () { this.fetchData() }, - beforeUpdate () { - this.$emit('refresh-data') - }, methods: { fetchData () { this.loading = true @@ -136,12 +133,12 @@ export default { message: this.$t('SSH Key(s) resetted sucessfully') }) this.$parent.$parent.close() + this.$emit('refresh-data') }).catch(error => { this.$notifyError(error) }).finally(() => { this.loading = false }) - console.log('api') }, closeAction () { this.$emit('close-action') From 32da94109915a9c99496ce166b95fd3f0a82cc25 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 13 Aug 2021 08:43:44 +0530 Subject: [PATCH 23/45] schema error resolved --- .../META-INF/db/schema-41510to41600.sql | 184 +----------------- 1 file changed, 2 insertions(+), 182 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql index fcb2ff236bb5..3c07d9a03c04 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41510to41600.sql @@ -394,8 +394,7 @@ from DROP VIEW IF EXISTS `cloud`.`user_vm_view`; -CREATE - VIEW `user_vm_view` AS +CREATE VIEW `cloud`.`user_vm_view` AS SELECT `vm_instance`.`id` AS `id`, `vm_instance`.`name` AS `name`, @@ -506,7 +505,6 @@ SELECT `user_ip_address`.`id` AS `public_ip_id`, `user_ip_address`.`uuid` AS `public_ip_uuid`, `user_ip_address`.`public_ip_address` AS `public_ip_address`, - `ssh_keypairs`.`keypair_name` AS `keypair_name`, `resource_tags`.`id` AS `tag_id`, `resource_tags`.`uuid` AS `tag_uuid`, `resource_tags`.`key` AS `tag_key`, @@ -530,7 +528,7 @@ SELECT `affinity_group`.`description` AS `affinity_group_description`, `vm_instance`.`dynamically_scalable` AS `dynamically_scalable` FROM - (((((((((((((((((((((((((((((((((`user_vm` + ((((((((((((((((((((((((((((((((`user_vm` JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) AND ISNULL(`vm_instance`.`removed`)))) JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) @@ -560,8 +558,6 @@ FROM LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) LEFT JOIN `user_vm_details` `ssh_details` ON (((`ssh_details`.`vm_id` = `vm_instance`.`id`) AND (`ssh_details`.`name` = 'SSH.PublicKey')))) - LEFT JOIN `ssh_keypairs` ON (((`ssh_keypairs`.`public_key` = `ssh_details`.`value`) - AND (`ssh_keypairs`.`account_id` = `account`.`id`)))) LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) AND (`resource_tags`.`resource_type` = 'UserVm')))) LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) @@ -695,179 +691,3 @@ CREATE VIEW `cloud`.`host_view` AS `cloud`.`user` ON `user`.`uuid` = `last_annotation_view`.`user_uuid` GROUP BY `host`.`id`; - -DROP VIEW IF EXISTS `cloud`.`user_vm_view`; -CREATE VIEW `cloud`.`user_vm_view` AS - SELECT - `vm_instance`.`id` AS `id`, - `vm_instance`.`name` AS `name`, - `user_vm`.`display_name` AS `display_name`, - `user_vm`.`user_data` AS `user_data`, - `account`.`id` AS `account_id`, - `account`.`uuid` AS `account_uuid`, - `account`.`account_name` AS `account_name`, - `account`.`type` AS `account_type`, - `domain`.`id` AS `domain_id`, - `domain`.`uuid` AS `domain_uuid`, - `domain`.`name` AS `domain_name`, - `domain`.`path` AS `domain_path`, - `projects`.`id` AS `project_id`, - `projects`.`uuid` AS `project_uuid`, - `projects`.`name` AS `project_name`, - `instance_group`.`id` AS `instance_group_id`, - `instance_group`.`uuid` AS `instance_group_uuid`, - `instance_group`.`name` AS `instance_group_name`, - `vm_instance`.`uuid` AS `uuid`, - `vm_instance`.`user_id` AS `user_id`, - `vm_instance`.`last_host_id` AS `last_host_id`, - `vm_instance`.`vm_type` AS `type`, - `vm_instance`.`limit_cpu_use` AS `limit_cpu_use`, - `vm_instance`.`created` AS `created`, - `vm_instance`.`state` AS `state`, - `vm_instance`.`removed` AS `removed`, - `vm_instance`.`ha_enabled` AS `ha_enabled`, - `vm_instance`.`hypervisor_type` AS `hypervisor_type`, - `vm_instance`.`instance_name` AS `instance_name`, - `vm_instance`.`guest_os_id` AS `guest_os_id`, - `vm_instance`.`display_vm` AS `display_vm`, - `guest_os`.`uuid` AS `guest_os_uuid`, - `vm_instance`.`pod_id` AS `pod_id`, - `host_pod_ref`.`uuid` AS `pod_uuid`, - `vm_instance`.`private_ip_address` AS `private_ip_address`, - `vm_instance`.`private_mac_address` AS `private_mac_address`, - `vm_instance`.`vm_type` AS `vm_type`, - `data_center`.`id` AS `data_center_id`, - `data_center`.`uuid` AS `data_center_uuid`, - `data_center`.`name` AS `data_center_name`, - `data_center`.`is_security_group_enabled` AS `security_group_enabled`, - `data_center`.`networktype` AS `data_center_type`, - `host`.`id` AS `host_id`, - `host`.`uuid` AS `host_uuid`, - `host`.`name` AS `host_name`, - `vm_template`.`id` AS `template_id`, - `vm_template`.`uuid` AS `template_uuid`, - `vm_template`.`name` AS `template_name`, - `vm_template`.`display_text` AS `template_display_text`, - `vm_template`.`enable_password` AS `password_enabled`, - `iso`.`id` AS `iso_id`, - `iso`.`uuid` AS `iso_uuid`, - `iso`.`name` AS `iso_name`, - `iso`.`display_text` AS `iso_display_text`, - `service_offering`.`id` AS `service_offering_id`, - `svc_disk_offering`.`uuid` AS `service_offering_uuid`, - `disk_offering`.`uuid` AS `disk_offering_uuid`, - `disk_offering`.`id` AS `disk_offering_id`, - (CASE - WHEN ISNULL(`service_offering`.`cpu`) THEN `custom_cpu`.`value` - ELSE `service_offering`.`cpu` - END) AS `cpu`, - (CASE - WHEN ISNULL(`service_offering`.`speed`) THEN `custom_speed`.`value` - ELSE `service_offering`.`speed` - END) AS `speed`, - (CASE - WHEN ISNULL(`service_offering`.`ram_size`) THEN `custom_ram_size`.`value` - ELSE `service_offering`.`ram_size` - END) AS `ram_size`, - `backup_offering`.`uuid` AS `backup_offering_uuid`, - `backup_offering`.`id` AS `backup_offering_id`, - `svc_disk_offering`.`name` AS `service_offering_name`, - `disk_offering`.`name` AS `disk_offering_name`, - `backup_offering`.`name` AS `backup_offering_name`, - `storage_pool`.`id` AS `pool_id`, - `storage_pool`.`uuid` AS `pool_uuid`, - `storage_pool`.`pool_type` AS `pool_type`, - `volumes`.`id` AS `volume_id`, - `volumes`.`uuid` AS `volume_uuid`, - `volumes`.`device_id` AS `volume_device_id`, - `volumes`.`volume_type` AS `volume_type`, - `security_group`.`id` AS `security_group_id`, - `security_group`.`uuid` AS `security_group_uuid`, - `security_group`.`name` AS `security_group_name`, - `security_group`.`description` AS `security_group_description`, - `nics`.`id` AS `nic_id`, - `nics`.`uuid` AS `nic_uuid`, - `nics`.`network_id` AS `network_id`, - `nics`.`ip4_address` AS `ip_address`, - `nics`.`ip6_address` AS `ip6_address`, - `nics`.`ip6_gateway` AS `ip6_gateway`, - `nics`.`ip6_cidr` AS `ip6_cidr`, - `nics`.`default_nic` AS `is_default_nic`, - `nics`.`gateway` AS `gateway`, - `nics`.`netmask` AS `netmask`, - `nics`.`mac_address` AS `mac_address`, - `nics`.`broadcast_uri` AS `broadcast_uri`, - `nics`.`isolation_uri` AS `isolation_uri`, - `vpc`.`id` AS `vpc_id`, - `vpc`.`uuid` AS `vpc_uuid`, - `networks`.`uuid` AS `network_uuid`, - `networks`.`name` AS `network_name`, - `networks`.`traffic_type` AS `traffic_type`, - `networks`.`guest_type` AS `guest_type`, - `user_ip_address`.`id` AS `public_ip_id`, - `user_ip_address`.`uuid` AS `public_ip_uuid`, - `user_ip_address`.`public_ip_address` AS `public_ip_address`, - `resource_tags`.`id` AS `tag_id`, - `resource_tags`.`uuid` AS `tag_uuid`, - `resource_tags`.`key` AS `tag_key`, - `resource_tags`.`value` AS `tag_value`, - `resource_tags`.`domain_id` AS `tag_domain_id`, - `domain`.`uuid` AS `tag_domain_uuid`, - `domain`.`name` AS `tag_domain_name`, - `resource_tags`.`account_id` AS `tag_account_id`, - `account`.`account_name` AS `tag_account_name`, - `resource_tags`.`resource_id` AS `tag_resource_id`, - `resource_tags`.`resource_uuid` AS `tag_resource_uuid`, - `resource_tags`.`resource_type` AS `tag_resource_type`, - `resource_tags`.`customer` AS `tag_customer`, - `async_job`.`id` AS `job_id`, - `async_job`.`uuid` AS `job_uuid`, - `async_job`.`job_status` AS `job_status`, - `async_job`.`account_id` AS `job_account_id`, - `affinity_group`.`id` AS `affinity_group_id`, - `affinity_group`.`uuid` AS `affinity_group_uuid`, - `affinity_group`.`name` AS `affinity_group_name`, - `affinity_group`.`description` AS `affinity_group_description`, - `vm_instance`.`dynamically_scalable` AS `dynamically_scalable` - FROM - (((((((((((((((((((((((((((((((((`user_vm` - JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) - AND ISNULL(`vm_instance`.`removed`)))) - JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) - JOIN `domain` ON ((`vm_instance`.`domain_id` = `domain`.`id`))) - LEFT JOIN `guest_os` ON ((`vm_instance`.`guest_os_id` = `guest_os`.`id`))) - LEFT JOIN `host_pod_ref` ON ((`vm_instance`.`pod_id` = `host_pod_ref`.`id`))) - LEFT JOIN `projects` ON ((`projects`.`project_account_id` = `account`.`id`))) - LEFT JOIN `instance_group_vm_map` ON ((`vm_instance`.`id` = `instance_group_vm_map`.`instance_id`))) - LEFT JOIN `instance_group` ON ((`instance_group_vm_map`.`group_id` = `instance_group`.`id`))) - LEFT JOIN `data_center` ON ((`vm_instance`.`data_center_id` = `data_center`.`id`))) - LEFT JOIN `host` ON ((`vm_instance`.`host_id` = `host`.`id`))) - LEFT JOIN `vm_template` ON ((`vm_instance`.`vm_template_id` = `vm_template`.`id`))) - LEFT JOIN `vm_template` `iso` ON ((`iso`.`id` = `user_vm`.`iso_id`))) - LEFT JOIN `service_offering` ON ((`vm_instance`.`service_offering_id` = `service_offering`.`id`))) - LEFT JOIN `disk_offering` `svc_disk_offering` ON ((`vm_instance`.`service_offering_id` = `svc_disk_offering`.`id`))) - LEFT JOIN `disk_offering` ON ((`vm_instance`.`disk_offering_id` = `disk_offering`.`id`))) - LEFT JOIN `backup_offering` ON ((`vm_instance`.`backup_offering_id` = `backup_offering`.`id`))) - LEFT JOIN `volumes` ON ((`vm_instance`.`id` = `volumes`.`instance_id`))) - LEFT JOIN `storage_pool` ON ((`volumes`.`pool_id` = `storage_pool`.`id`))) - LEFT JOIN `security_group_vm_map` ON ((`vm_instance`.`id` = `security_group_vm_map`.`instance_id`))) - LEFT JOIN `security_group` ON ((`security_group_vm_map`.`security_group_id` = `security_group`.`id`))) - LEFT JOIN `nics` ON (((`vm_instance`.`id` = `nics`.`instance_id`) - AND ISNULL(`nics`.`removed`)))) - LEFT JOIN `networks` ON ((`nics`.`network_id` = `networks`.`id`))) - LEFT JOIN `vpc` ON (((`networks`.`vpc_id` = `vpc`.`id`) - AND ISNULL(`vpc`.`removed`)))) - LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) - LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) - AND (`resource_tags`.`resource_type` = 'UserVm')))) - LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) - AND (`async_job`.`instance_type` = 'VirtualMachine') - AND (`async_job`.`job_status` = 0)))) - LEFT JOIN `affinity_group_vm_map` ON ((`vm_instance`.`id` = `affinity_group_vm_map`.`instance_id`))) - LEFT JOIN `affinity_group` ON ((`affinity_group_vm_map`.`affinity_group_id` = `affinity_group`.`id`))) - LEFT JOIN `user_vm_details` `custom_cpu` ON (((`custom_cpu`.`vm_id` = `vm_instance`.`id`) - AND (`custom_cpu`.`name` = 'CpuNumber')))) - LEFT JOIN `user_vm_details` `custom_speed` ON (((`custom_speed`.`vm_id` = `vm_instance`.`id`) - AND (`custom_speed`.`name` = 'CpuSpeed')))) - LEFT JOIN `user_vm_details` `custom_ram_size` ON (((`custom_ram_size`.`vm_id` = `vm_instance`.`id`) - AND (`custom_ram_size`.`name` = 'memory')))); From 3841ca33b1c37caf1a83badf474ce986d0f5fd39 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Mon, 16 Aug 2021 12:33:31 +0530 Subject: [PATCH 24/45] potential null pointer exception removed --- .../KubernetesClusterResourceModifierActionWorker.java | 7 +++---- .../actionworkers/KubernetesClusterStartWorker.java | 2 +- .../src/main/java/com/cloud/vm/UserVmManagerImpl.java | 10 ++++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java index a23d361aa1f5..9362efa2f760 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java @@ -146,10 +146,9 @@ private String getKubernetesNodeConfig(final String joinIp, final boolean ejectI final String clusterTokenKey = "{{ k8s_control_node.cluster.token }}"; final String ejectIsoKey = "{{ k8s.eject.iso }}"; String pubKey = "- \"" + configurationDao.getValue("ssh.publickey") + "\""; - List sshKeyPairs = new ArrayList(); - sshKeyPairs.add(kubernetesCluster.getKeyPair()); - if (!sshKeyPairs.isEmpty() && !Strings.isNullOrEmpty(sshKeyPairs.get(0))) { - SSHKeyPairVO sshkp = sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPairs.get(0)); + String sshKeyPair = kubernetesCluster.getKeyPair(); + if (!Strings.isNullOrEmpty(sshKeyPair)) { + SSHKeyPairVO sshkp = sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPair); if (sshkp != null) { pubKey += "\n - \"" + sshkp.getPublicKey() + "\""; } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java index b56d9011f4c4..8f0377a5858c 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java @@ -208,7 +208,7 @@ private UserVm createKubernetesControlNode(final Network network, String serverI logAndThrow(Level.ERROR, "Failed to read Kubernetes control node configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sControlNodeConfig.getBytes(StringUtils.getPreferredCharset())); - List keypairs = null; + List keypairs = new ArrayList(); keypairs.add(kubernetesCluster.getKeyPair()); controlVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4dc822ed46a1..247fa159e594 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -867,13 +867,11 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce if (!cmd.getNames().isEmpty()) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); - for (SSHKeyPairVO s : s_list) { - if (s == null) { - throw new InvalidParameterValueException("Keypair given does not exist"); - } - } keypairnames = String.join(", ", cmd.getNames()); } + else { + throw new InvalidParameterValueException("No keypair given as input"); + } if (s_list == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() @@ -3812,7 +3810,7 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe String sshPublicKey = ""; String keypairnames = ""; - if (sshKeyPairs != null) { + if (!sshKeyPairs.isEmpty()) { keypairnames = String.join(", ", sshKeyPairs); List pairs = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), sshKeyPairs); for (SSHKeyPairVO pair : pairs) { From 0310e2eacae61a406eb2a14890f1311396e402ec Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 08:57:03 +0530 Subject: [PATCH 25/45] Update UserVmManagerImpl.java unnecessary check removed. --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 247fa159e594..6038920d7975 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3824,9 +3824,6 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe } } } - else { - throw new InvalidParameterValueException("Keypairs was not found."); - } LinkedHashMap> networkNicMap = new LinkedHashMap<>(); @@ -4113,11 +4110,11 @@ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCap vm.details.putAll(details); } - if (sshPublicKey != null) { + if (sshPublicKey != "") { vm.setDetail(VmDetailConstants.SSH_PUBLIC_KEY, sshPublicKey); } - if (sshkeypairs != null) { + if (sshkeypairs != "") { vm.setDetail(VmDetailConstants.KEY_PAIR_NAMES, sshkeypairs); } From c9fd95c05f84288cb04546dc224af1f2ff06215c Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 15:44:40 +0530 Subject: [PATCH 26/45] Update DeployVMCmd.java --- .../org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 57bb510a2710..5e221be3222b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -153,7 +153,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.USER_DATA, type = CommandType.STRING, description = "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.", length = 32768) private String userData; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") private String sshKeyPairName; @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") From b632f225c38acd3eefc8448fc71878ac8909bf06 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 15:58:32 +0530 Subject: [PATCH 27/45] Update DeployVMCmd.java --- .../cloudstack/api/command/user/vm/DeployVMCmd.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 5e221be3222b..24e23bf33c3b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -438,8 +438,14 @@ public String getName() { } public List getSSHKeyPairNames() { - if(sshKeyPairName != null) sshKeyPairNames.add(sshKeyPairName); - return sshKeyPairNames; + List sshKeyPairs; + if(sshKeyPairNames != null) { + sshKeyPairs = sshKeyPairNames; + } + if(sshKeyPairName != null && !sshKeyPairName.isEmpty()) { + sshKeyPairs.add(sshKeyPairName); + } + return sshKeyPairs; } public Long getHostId() { From 45c6b992ac923b46d3e9b9bced374a670494ac59 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 16:06:12 +0530 Subject: [PATCH 28/45] Update ResetVMSSHKeyCmd.java --- .../cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index b5abc95f3765..f00f196e8408 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -60,7 +60,7 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = UserVmResponse.class, required = true, description = "The ID of the virtual machine") private Long id; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the ssh key pair to bt used to login to the virtual machine") + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING ,description = "name of the ssh key pair to bt used to login to the virtual machine") String name; @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING ,description = "name of the multiple ssh key pairs to be used to login to the virtual machine") @@ -84,8 +84,10 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { ///////////////////////////////////////////////////// public List getNames() { - if (name != null && name != "") names.add(name); - return names; + List keypairnames; + if(names != null) { keypairnames = names; } + if(name != null && !name.isEmpty()) { keypairnames.add(name); } + return keypairnames; } public Long getId() { From 792704c6bbca14aac5e88ac5063d8406e841f2cc Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 16:08:54 +0530 Subject: [PATCH 29/45] Update UserVmJoinDaoImpl.java --- .../main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 88f84e032d2a..f652c0d61ca4 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -327,7 +327,7 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us Map resourceDetails = new HashMap(); for (UserVmDetailVO userVmDetailVO : vmDetails) { if (userVmDetailVO.getName().startsWith(VmDetailConstants.KEY_PAIR_NAMES)) { - s_logger.info(userVmDetailVO.getValue()); + s_logger.info("SSH Keypair names saved in VMDetails are " + userVmDetailVO.getValue()); userVmResponse.setKeyPairNames(userVmDetailVO.getValue()); } if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) || From 12c22a223af9b6a91e0d2364b772fbcb65407d25 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 16:48:57 +0530 Subject: [PATCH 30/45] . --- .../org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java | 2 +- .../apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 24e23bf33c3b..396ed991e434 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -438,7 +438,7 @@ public String getName() { } public List getSSHKeyPairNames() { - List sshKeyPairs; + List sshKeyPairs = new ArrayList(); if(sshKeyPairNames != null) { sshKeyPairs = sshKeyPairNames; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index f00f196e8408..ff8b0aff859f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -84,7 +84,7 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { ///////////////////////////////////////////////////// public List getNames() { - List keypairnames; + List keypairnames = new ArrayList(); if(names != null) { keypairnames = names; } if(name != null && !name.isEmpty()) { keypairnames.add(name); } return keypairnames; From 127c2fbcad83f6931a83a767c6351e5e6ac7ff88 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Wed, 18 Aug 2021 22:45:49 +0530 Subject: [PATCH 31/45] arraylist --- .../apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index ff8b0aff859f..f2c776cb5d40 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -42,6 +42,7 @@ import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; +import java.util.ArrayList; import java.util.List; @APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. " + From 9d93efd48dd06d319a90e30b86c097138a863e52 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 20 Aug 2021 12:09:09 +0530 Subject: [PATCH 32/45] Update DeployVMCmd.java --- .../org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index 396ed991e434..8e2a7659e1c7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -153,7 +153,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.USER_DATA, type = CommandType.STRING, description = "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.", length = 32768) private String userData; - @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") + @Parameter(name = ApiConstants.SSH_KEYPAIR, type = CommandType.STRING, description = "name of the ssh key pair used to login to the virtual machine") private String sshKeyPairName; @Parameter(name = ApiConstants.SSH_KEYPAIRS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "name of the ssh key pairs used to login to the virtual machine") From 83d4e9af31fecdfc190459ab1f8b8b2ec3d87d52 Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 20 Aug 2021 12:17:51 +0530 Subject: [PATCH 33/45] Update UserVmManagerImpl.java --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 6038920d7975..b2cd9d66d088 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -865,7 +865,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce List s_list = new ArrayList<>(); - if (!cmd.getNames().isEmpty()) { + if (!cmd.getNames().isEmpty() && cmd.getNames() != null) { s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); keypairnames = String.join(", ", cmd.getNames()); } @@ -873,7 +873,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce throw new InvalidParameterValueException("No keypair given as input"); } - if (s_list == null) { + if (s_list.isEmpty() || s_list == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + " in specified domain id"); } From 0b48e23c6e8d48cf30e2847a84311b31866f8c4f Mon Sep 17 00:00:00 2001 From: Bikram Biswas Date: Fri, 27 Aug 2021 22:09:35 +0530 Subject: [PATCH 34/45] Update ResetVMSSHKeyCmd.java --- .../cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index f2c776cb5d40..316f24aaf77c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -86,8 +86,12 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { public List getNames() { List keypairnames = new ArrayList(); - if(names != null) { keypairnames = names; } - if(name != null && !name.isEmpty()) { keypairnames.add(name); } + if (names != null) { + keypairnames = names; + } + if (name != null && !name.isEmpty()) { + keypairnames.add(name); + } return keypairnames; } From 111b1ad1f5009f55263a5152540d8917172794d6 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Tue, 8 Feb 2022 12:56:50 +0530 Subject: [PATCH 35/45] Update db --- .../META-INF/db/schema-41520to41600.sql | 8 +++-- .../META-INF/db/schema-41610to41700.sql | 6 ++-- .../com/cloud/api/query/QueryManagerImpl.java | 4 +++ .../com/cloud/api/query/vo/UserVmJoinVO.java | 7 +++++ .../java/com/cloud/vm/UserVmManagerImpl.java | 30 +++++++++---------- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41520to41600.sql b/engine/schema/src/main/resources/META-INF/db/schema-41520to41600.sql index 8596251b2ed4..0f084c5b0bc8 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41520to41600.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41520to41600.sql @@ -407,7 +407,8 @@ from DROP VIEW IF EXISTS `cloud`.`user_vm_view`; -CREATE VIEW `cloud`.`user_vm_view` AS +CREATE + VIEW `user_vm_view` AS SELECT `vm_instance`.`id` AS `id`, `vm_instance`.`name` AS `name`, @@ -520,6 +521,7 @@ SELECT `user_ip_address`.`id` AS `public_ip_id`, `user_ip_address`.`uuid` AS `public_ip_uuid`, `user_ip_address`.`public_ip_address` AS `public_ip_address`, + `ssh_keypairs`.`keypair_name` AS `keypair_name`, `resource_tags`.`id` AS `tag_id`, `resource_tags`.`uuid` AS `tag_uuid`, `resource_tags`.`key` AS `tag_key`, @@ -543,7 +545,7 @@ SELECT `affinity_group`.`description` AS `affinity_group_description`, `vm_instance`.`dynamically_scalable` AS `dynamically_scalable` FROM - ((((((((((((((((((((((((((((((((`user_vm` + (((((((((((((((((((((((((((((((((`user_vm` JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) AND ISNULL(`vm_instance`.`removed`)))) JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) @@ -573,6 +575,8 @@ FROM LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) LEFT JOIN `user_vm_details` `ssh_details` ON (((`ssh_details`.`vm_id` = `vm_instance`.`id`) AND (`ssh_details`.`name` = 'SSH.PublicKey')))) + LEFT JOIN `ssh_keypairs` ON (((`ssh_keypairs`.`public_key` = `ssh_details`.`value`) + AND (`ssh_keypairs`.`account_id` = `account`.`id`)))) LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) AND (`resource_tags`.`resource_type` = 'UserVm')))) LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 822cf00e630b..f68e9ff5c3af 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -471,7 +471,7 @@ SELECT `user_ip_address`.`id` AS `public_ip_id`, `user_ip_address`.`uuid` AS `public_ip_uuid`, `user_ip_address`.`public_ip_address` AS `public_ip_address`, - `ssh_keypairs`.`keypair_name` AS `keypair_name`, + `ssh_details`.`value` AS `keypair_names`, `resource_tags`.`id` AS `tag_id`, `resource_tags`.`uuid` AS `tag_uuid`, `resource_tags`.`key` AS `tag_key`, @@ -495,7 +495,7 @@ SELECT `affinity_group`.`description` AS `affinity_group_description`, `vm_instance`.`dynamically_scalable` AS `dynamically_scalable` FROM - (((((((((((((((((((((((((((((((((`user_vm` + ((((((((((((((((((((((((((((((((`user_vm` JOIN `vm_instance` ON (((`vm_instance`.`id` = `user_vm`.`id`) AND ISNULL(`vm_instance`.`removed`)))) JOIN `account` ON ((`vm_instance`.`account_id` = `account`.`id`))) @@ -525,8 +525,6 @@ FROM LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) LEFT JOIN `user_vm_details` `ssh_details` ON (((`ssh_details`.`vm_id` = `vm_instance`.`id`) AND (`ssh_details`.`name` = 'SSH.PublicKey')))) - LEFT JOIN `ssh_keypairs` ON (((`ssh_keypairs`.`public_key` = `ssh_details`.`value`) - AND (`ssh_keypairs`.`account_id` = `account`.`id`)))) LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) AND (`resource_tags`.`resource_type` = 'UserVm')))) LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 24556d1ab2e0..8dc2e0d7716f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -1071,6 +1071,10 @@ private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cm sb.and("affinityGroupId", sb.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); } + if (keyPairName != null) { + sb.and("keyPairName", sb.entity().getKeypairNames(), SearchCriteria.Op.IN); + } + if (!isRootAdmin) { sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); } diff --git a/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java index 4e3569af381b..43d6b58a488c 100644 --- a/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/UserVmJoinVO.java @@ -353,6 +353,9 @@ public class UserVmJoinVO extends BaseViewWithTagInformationVO implements Contro @Column(name = "project_name") private String projectName; + @Column(name = "keypair_names") + private String keypairNames; + @Column(name = "job_id") private Long jobId; @@ -776,6 +779,10 @@ public String getProjectName() { return projectName; } + public String getKeypairNames() { + return keypairNames; + } + public boolean isLimitCpuUse() { return limitCpuUse; } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 599a84a6d78c..4e694d973547 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -908,36 +908,34 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce } String keypairnames = ""; - - List s_list = new ArrayList<>(); + String sshPublicKeys = ""; + List pairs = new ArrayList<>(); if (!cmd.getNames().isEmpty() && cmd.getNames() != null) { - s_list = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); + pairs = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), cmd.getNames()); + for (SSHKeyPairVO pair : pairs) { + if (pair == null) { + throw new InvalidParameterValueException("A key pair with name '" + pair.getName() + "' was not found."); + } + String publicKey = pair.getPublicKey(); + sshPublicKeys = sshPublicKeys + publicKey + "\n"; + s_logger.info("the public key for keypair name " + pair.getName() + " is " + publicKey); + + } keypairnames = String.join(", ", cmd.getNames()); } else { throw new InvalidParameterValueException("No keypair given as input"); } - if (s_list.isEmpty() || s_list == null) { + if (pairs.isEmpty() || pairs == null) { throw new InvalidParameterValueException("Any key pair with the given names does not exist for account " + owner.getAccountName() + " in specified domain id"); } _accountMgr.checkAccess(caller, null, true, userVm); - String sshPublicKey = ""; - - if (s_list != null) { - for (SSHKeyPairVO s_each : s_list) { - String publicKey = s_each.getPublicKey(); - sshPublicKey = sshPublicKey + publicKey; - sshPublicKey = sshPublicKey + "\n"; - s_logger.info("the public key for keypair name " + s_each.getName() + " is " + publicKey); - } - } - - boolean result = resetVMSSHKeyInternal(vmId, sshPublicKey, keypairnames); + boolean result = resetVMSSHKeyInternal(vmId, sshPublicKeys, keypairnames); UserVmVO vm = _vmDao.findById(vmId); _vmDao.loadDetails(vm); From 5703b8f8491588754f5b8b5d62c38d15fcb730cc Mon Sep 17 00:00:00 2001 From: davidjumani Date: Tue, 8 Feb 2022 14:23:52 +0530 Subject: [PATCH 36/45] Fix list vm by keypair --- api/src/main/java/com/cloud/vm/VmDetailConstants.java | 1 + .../main/resources/META-INF/db/schema-41610to41700.sql | 2 +- .../main/java/com/cloud/api/query/QueryManagerImpl.java | 2 +- .../java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 6 +----- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 8 ++++---- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java index 95900b2a88fc..d0b1cfb4705c 100644 --- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java +++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java @@ -59,6 +59,7 @@ public interface VmDetailConstants { String MESSAGE_RESERVED_CAPACITY_FREED_FLAG = "Message.ReservedCapacityFreed.Flag"; String DEPLOY_VM = "deployvm"; String SSH_PUBLIC_KEY = "SSH.PublicKey"; + String SSH_KEY_PAIR_NAMES = "SSH.KeyPairNames"; String PASSWORD = "password"; String ENCRYPTED_PASSWORD = "Encrypted.Password"; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index f68e9ff5c3af..d03d80383e09 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -524,7 +524,7 @@ FROM AND ISNULL(`vpc`.`removed`)))) LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`))) LEFT JOIN `user_vm_details` `ssh_details` ON (((`ssh_details`.`vm_id` = `vm_instance`.`id`) - AND (`ssh_details`.`name` = 'SSH.PublicKey')))) + AND (`ssh_details`.`name` = 'SSH.KeyPairNames')))) LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`) AND (`resource_tags`.`resource_type` = 'UserVm')))) LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `vm_instance`.`id`) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 8dc2e0d7716f..465cefd15c61 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -1072,7 +1072,7 @@ private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cm } if (keyPairName != null) { - sb.and("keyPairName", sb.entity().getKeypairNames(), SearchCriteria.Op.IN); + sb.and("keyPairName", sb.entity().getKeypairNames(), SearchCriteria.Op.FIND_IN_SET); } if (!isRootAdmin) { diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 0ceb20245df4..9eee2d62d777 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -29,7 +29,6 @@ import javax.inject.Inject; import com.cloud.storage.DiskOfferingVO; -import com.cloud.vm.VmDetailConstants; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; @@ -220,6 +219,7 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us userVmResponse.setPublicIpId(userVm.getPublicIpUuid()); userVmResponse.setPublicIp(userVm.getPublicIpAddress()); + userVmResponse.setKeyPairNames(userVm.getKeypairNames()); userVmResponse.setOsTypeId(userVm.getGuestOsUuid()); GuestOS guestOS = ApiDBUtils.findGuestOSById(userVm.getGuestOsId()); if (guestOS != null) { @@ -344,10 +344,6 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us if (vmDetails != null) { Map resourceDetails = new HashMap(); for (UserVmDetailVO userVmDetailVO : vmDetails) { - if (userVmDetailVO.getName().startsWith(VmDetailConstants.KEY_PAIR_NAMES)) { - s_logger.info("SSH Keypair names saved in VMDetails are " + userVmDetailVO.getValue()); - userVmResponse.setKeyPairNames(userVmDetailVO.getValue()); - } if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) || (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES))) { resourceDetails.put(userVmDetailVO.getName(), userVmDetailVO.getValue()); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4e694d973547..13be55788685 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -922,7 +922,7 @@ public UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableExce s_logger.info("the public key for keypair name " + pair.getName() + " is " + publicKey); } - keypairnames = String.join(", ", cmd.getNames()); + keypairnames = String.join(",", cmd.getNames()); } else { throw new InvalidParameterValueException("No keypair given as input"); @@ -983,7 +983,7 @@ private boolean resetVMSSHKeyInternal(Long vmId, String sshPublicKey, String key final UserVmVO userVm = _vmDao.findById(vmId); _vmDao.loadDetails(userVm); userVm.setDetail(VmDetailConstants.SSH_PUBLIC_KEY, sshPublicKey); - userVm.setDetail(VmDetailConstants.KEY_PAIR_NAMES, keypairnames); + userVm.setDetail(VmDetailConstants.SSH_KEY_PAIR_NAMES, keypairnames); _vmDao.saveDetails(userVm); if (vmInstance.getState() == State.Stopped) { @@ -3962,7 +3962,7 @@ private UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffe String keypairnames = ""; if (!sshKeyPairs.isEmpty()) { - keypairnames = String.join(", ", sshKeyPairs); + keypairnames = String.join(",", sshKeyPairs); List pairs = _sshKeyPairDao.findByNames(owner.getAccountId(), owner.getDomainId(), sshKeyPairs); for (SSHKeyPairVO pair : pairs) { if (pair == null) { @@ -4283,7 +4283,7 @@ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCap } if (sshkeypairs != "") { - vm.setDetail(VmDetailConstants.KEY_PAIR_NAMES, sshkeypairs); + vm.setDetail(VmDetailConstants.SSH_KEY_PAIR_NAMES, sshkeypairs); } if (keyboard != null && !keyboard.isEmpty()) { From ca2a764bc76259a98044def901b1e977707b4fe2 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Tue, 8 Feb 2022 14:35:13 +0530 Subject: [PATCH 37/45] ui fixes --- ui/public/locales/en.json | 1 + ui/src/components/view/InfoCard.vue | 14 ++++++--- ui/src/config/section/compute.js | 26 ++++++++++++++-- ui/src/views/compute/DeployVM.vue | 11 ++----- ui/src/views/compute/ResetSSH.vue | 31 ++++++++++--------- .../compute/wizard/SshKeyPairSelection.vue | 19 ++---------- 6 files changed, 57 insertions(+), 45 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index bd4bdf80f9e3..c01bd133e7e6 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -1238,6 +1238,7 @@ "label.keyboard": "Keyboard language", "label.keyboardtype": "Keyboard type", "label.keypair": "SSH Key Pair", +"label.keypairs": "SSH Key Pair(s)", "label.kubeconfig.cluster": "Kubernetes Cluster Config", "label.kubernetes": "Kubernetes", "label.kubernetes.cluster": "Kubernetes cluster", diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 408957d78145..fc36154dcb2c 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -362,11 +362,11 @@
    -
    {{ $t('SSH Key Pairs') }}
    +
    {{ $t('label.keypairs') }}
  • - {{ keypair }} + {{ keypair }}
  • @@ -607,7 +607,7 @@
    + :to="{ path: '/' + item.name + '?' + item.param + '=' + (item.value ? resource[item.value] : item.param === 'account' ? resource.name + '&domainid=' + resource.domainid : item.param === 'keypair' ? resource.name : resource.id) }"> {{ $t('label.view') + ' ' + $t(item.title) }} @@ -816,9 +816,13 @@ export default { return null }, keypairs () { - if (this.resource.keypairs && this.resource.keypairs !== '') { - return this.resource.keypairs.split(', ') + if (!this.resource.keypairs) { + return null } + if (typeof this.resource.keypairs === 'string' || this.resource.keypairs instanceof String) { + return this.resource.keypairs.split(',') + } + return [this.resource.keypairs.toString()] }, templateIcon () { return this.resource.templateid diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js index 9bb24e61af83..f1f23405a08b 100644 --- a/ui/src/config/section/compute.js +++ b/ui/src/config/section/compute.js @@ -343,9 +343,31 @@ export default { message: 'message.desc.reset.ssh.key.pair', docHelp: 'adminguide/virtual_machines.html#resetting-ssh-keys', dataView: true, + args: ['keypair', 'account', 'domainid'], show: (record) => { return ['Stopped'].includes(record.state) }, - component: () => import('@/views/compute/ResetSSH'), - popup: true + mapping: { + keypair: { + api: 'listSSHKeyPairs', + params: (record) => { return { account: record.account, domainid: record.domainid } } + }, + account: { + value: (record) => { return record.account } + }, + domainid: { + value: (record) => { return record.domainid } + } + }, + successMethod: (obj, result) => { + const vm = result.jobresult.virtualmachine || {} + if (result.jobstatus === 1 && vm.password) { + const name = vm.displayname || vm.name || vm.id + obj.$notification.success({ + message: `${obj.$t('label.reset.ssh.key.pair.on.vm')}: ` + name, + description: `${obj.$t('label.password.reset.confirm')}: ` + vm.password, + duration: 0 + }) + } + } }, { api: 'assignVirtualMachine', diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index 466a9bc8d676..8e9c0756206b 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -461,7 +461,7 @@ :items="options.sshKeyPairs" :row-count="rowCount.sshKeyPairs" :zoneId="zoneId" - :value="keyPairs" + :value="sshKeyPairs" :loading="loading.sshKeyPairs" :preFillContent="dataPreFill" @select-ssh-key-pair-item="($event) => updateSshKeyPairs($event)" @@ -936,9 +936,6 @@ export default { affinityGroupIds () { return _.map(this.affinityGroups, 'id') }, - keyPairs () { - return _.map(this.sshKeyPairs, 'name') - }, params () { return { serviceOfferings: { @@ -1206,7 +1203,6 @@ export default { if (this.rootDiskSelected?.id) { instanceConfig.overridediskofferingid = this.rootDiskSelected.id } - console.log('overrided value ' + instanceConfig.overridediskofferingid) if (instanceConfig.overridediskofferingid) { this.overrideDiskOffering = _.find(this.options.diskOfferings, (option) => option.id === instanceConfig.overridediskofferingid) } else { @@ -1215,7 +1211,6 @@ export default { this.zone = _.find(this.options.zones, (option) => option.id === instanceConfig.zoneid) this.affinityGroups = _.filter(this.options.affinityGroups, (option) => _.includes(instanceConfig.affinitygroupids, option.id)) this.networks = _.filter(this.options.networks, (option) => _.includes(instanceConfig.networkids, option.id)) - this.sshKeyPairs = _.filter(this.options.sshKeyPairs, (option) => _.includes(instanceConfig.keypairs, option.name)) if (this.zone) { this.vm.zoneid = this.zone.id @@ -1297,8 +1292,7 @@ export default { this.vm.affinitygroup = this.affinityGroups } if (this.sshKeyPairs) { - console.log(this.sshKeyPairs) - this.vm.keypairs = this.sshKeyPairs.map((sshKeyPair) => { return sshKeyPair.name }) + this.vm.keypairs = this.sshKeyPairs } } }, @@ -1640,6 +1634,7 @@ export default { this.form.setFieldsValue({ keypairs: names }) + this.sshKeyPairs = names.map((sshKeyPair) => { return sshKeyPair.name }) }, escapePropertyKey (key) { return key.split('.').join('\\002E') diff --git a/ui/src/views/compute/ResetSSH.vue b/ui/src/views/compute/ResetSSH.vue index f3f9ce8950ee..5a40009446a9 100644 --- a/ui/src/views/compute/ResetSSH.vue +++ b/ui/src/views/compute/ResetSSH.vue @@ -17,9 +17,7 @@