From ddcb3d7b30f881be982213c784addcabe0135b9a Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Thu, 26 Jul 2012 20:51:26 +0530 Subject: [PATCH] CS-14770. ec2-run-instances and ec2-describe-instances don't return keypair information. Changing CS deployVirtualMachine and listVirtualMachine api response to include ssh keypair information. Component: AWSAPI. --- .../cloud/api/response/UserVmResponse.java | 7 +++++++ .../bridge/service/EC2SoapServiceImpl.java | 6 +++--- .../bridge/service/core/ec2/EC2Engine.java | 5 ++++- .../bridge/service/core/ec2/EC2Instance.java | 10 ++++++++++ .../cloud/stack/models/CloudStackUserVm.java | 9 +++++++++ server/src/com/cloud/api/ApiDBUtils.java | 20 ++++++++++++++++++- .../src/com/cloud/api/ApiResponseHelper.java | 9 ++++++++- .../src/com/cloud/user/dao/SSHKeyPairDao.java | 2 ++ .../com/cloud/user/dao/SSHKeyPairDaoImpl.java | 9 ++++++++- server/src/com/cloud/vm/dao/UserVmData.java | 9 +++++++++ .../cloud/vm/dao/UserVmDetailsDaoImpl.java | 2 +- 11 files changed, 80 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/api/response/UserVmResponse.java b/api/src/com/cloud/api/response/UserVmResponse.java index 0b8a3a0bbb1..da110c881f0 100755 --- a/api/src/com/cloud/api/response/UserVmResponse.java +++ b/api/src/com/cloud/api/response/UserVmResponse.java @@ -154,6 +154,9 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp @SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with vm", responseObject = ResourceTagResponse.class) private List tags; + @SerializedName(ApiConstants.SSH_KEYPAIR) @Param(description="ssh key-pair") + private String keyPairName; + public void setHypervisor(String hypervisor) { this.hypervisor = hypervisor; } @@ -344,4 +347,8 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp public void setTags(List tags) { this.tags = tags; } + + public void setKeyPairName(String keyPairName) { + this.keyPairName = keyPairName; + } } diff --git a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java index 8ad1b7447cb..e239175f131 100644 --- a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java +++ b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java @@ -1347,7 +1347,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); - param7.setKeyName( "" ); + param7.setKeyName( inst.getKeyPairName()); param7.setAmiLaunchIndex( "" ); param7.setInstanceType( inst.getServiceOffering()); @@ -1669,7 +1669,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param7.setPrivateDnsName( "" ); param7.setDnsName( "" ); param7.setReason( "" ); - param7.setKeyName( "" ); + param7.setKeyName( inst.getKeyPairName()); param7.setAmiLaunchIndex( "" ); ProductCodesSetType param9 = new ProductCodesSetType(); @@ -1722,7 +1722,7 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface { param19.setKey(""); param19.setValue(""); param18.addItem( param19 ); - param7.setTagSet( param18 ); + param7.setTagSet( param18 ); String hypervisor = inst.getHypervisor(); param7.setHypervisor((null != hypervisor ? hypervisor : "")); diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java index f66fcf75484..fd54eb4d61f 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java @@ -1514,6 +1514,8 @@ public class EC2Engine { vm.setDomainId(resp.getDomainId()); vm.setHypervisor(resp.getHypervisor()); vm.setServiceOffering( svcOffering.getName()); + vm.setKeyPairName(resp.getKeyPairName()); + instances.addInstance(vm); countCreated++; } @@ -1894,7 +1896,8 @@ public class EC2Engine { ec2Vm.setRootDeviceType(cloudVm.getRootDeviceType()); ec2Vm.setRootDeviceId(cloudVm.getRootDeviceId()); ec2Vm.setServiceOffering(serviceOfferingIdToInstanceType(cloudVm.getServiceOfferingId().toString())); - + ec2Vm.setKeyPairName(cloudVm.getKeyPairName()); + List nics = cloudVm.getNics(); for(CloudStackNic nic : nics) { if(nic.getIsDefault()) { diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java index 1a0efe89d7a..ca0c1d6489f 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Instance.java @@ -39,6 +39,7 @@ public class EC2Instance { private String hypervisor; private String rootDeviceType; private String rootDeviceId; + private String keyPairName; private List groupSet; private List tagsSet; @@ -59,6 +60,7 @@ public class EC2Instance { hypervisor = null; rootDeviceType = null; rootDeviceId = null; + keyPairName = null; groupSet = new ArrayList(); tagsSet = new ArrayList(); } @@ -191,6 +193,14 @@ public class EC2Instance { rootDeviceId = param; } + public String getKeyPairName() { + return keyPairName; + } + + public void setKeyPairName(String param) { + keyPairName = param; + } + public void addGroupName( String param ) { groupSet.add( param ); } diff --git a/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java b/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java index 6142f3e1489..e978cfdeb15 100644 --- a/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java +++ b/awsapi/src/com/cloud/stack/models/CloudStackUserVm.java @@ -66,6 +66,8 @@ public class CloudStackUserVm { private String jobId; @SerializedName(ApiConstants.JOB_STATUS) private Integer jobStatus; + @SerializedName(ApiConstants.SSH_KEYPAIR) + private String keyPairName; @SerializedName(ApiConstants.MEMORY) private Integer memory; @SerializedName(ApiConstants.NAME) @@ -339,6 +341,13 @@ public class CloudStackUserVm { return serviceOfferingName; } + /** + * @return the sshKeyPairName + */ + public String getKeyPairName() { + return keyPairName; + } + /** * @return the state */ diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 56d5218c8ef..d97810dfcd1 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -132,10 +132,12 @@ import com.cloud.user.Account; import com.cloud.user.AccountDetailsDao; import com.cloud.user.AccountVO; import com.cloud.user.ResourceLimitService; +import com.cloud.user.SSHKeyPairVO; import com.cloud.user.User; import com.cloud.user.UserStatisticsVO; import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.uservm.UserVm; @@ -146,6 +148,7 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.NicProfile; +import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; @@ -155,6 +158,7 @@ import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmData; +import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; public class ApiDBUtils { @@ -218,6 +222,8 @@ public class ApiDBUtils { private static AutoScaleVmGroupPolicyMapDao _asVmGroupPolicyMapDao; private static AutoScalePolicyDao _asPolicyDao; private static CounterDao _counterDao; + private static UserVmDetailsDao _userVmDetailsDao; + private static SSHKeyPairDao _sshKeyPairDao; static { _ms = (ManagementServer) ComponentLocator.getComponent(ManagementServer.Name); @@ -282,6 +288,9 @@ public class ApiDBUtils { _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); _counterDao = locator.getDao(CounterDao.class); + _sshKeyPairDao = locator.getDao(SSHKeyPairDao.class); + _userVmDetailsDao = locator.getDao(UserVmDetailsDao.class); + // Note: stats collector should already have been initialized by this time, otherwise a null instance is // returned @@ -861,4 +870,13 @@ public class ApiDBUtils { public static CounterVO getCounter(long counterId) { return _counterDao.findById(counterId); } -} + + public static String getKeyPairName(String sshPublicKey) { + SSHKeyPairVO sshKeyPair = _sshKeyPairDao.findByPublicKey(sshPublicKey); + return sshKeyPair.getName(); + } + + public static UserVmDetailVO findPublicKeyByVmId(long vmId) { + return _userVmDetailsDao.findDetail(vmId, "SSH.PublicKey"); + } +} diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c74d75bfb93..77d45c5971d 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -218,6 +218,7 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.NicProfile; +import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; @@ -3297,6 +3298,12 @@ public class ApiResponseHelper implements ResponseGenerator { } userVmResponse.setTags(tagResponses); + UserVmDetailVO userVmDetail = ApiDBUtils.findPublicKeyByVmId(userVmData.getId()); + if (userVmDetail != null && userVmDetail.getValue() != null) { + String keyPairName = ApiDBUtils.getKeyPairName(userVmDetail.getValue()); + userVmResponse.setKeyPairName(keyPairName); + } + return userVmResponse; } @@ -3976,4 +3983,4 @@ public class ApiResponseHelper implements ResponseGenerator { populateOwner(response, condition); return response; } -} +} diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDao.java b/server/src/com/cloud/user/dao/SSHKeyPairDao.java index c0d21b1925e..d4030e130c1 100644 --- a/server/src/com/cloud/user/dao/SSHKeyPairDao.java +++ b/server/src/com/cloud/user/dao/SSHKeyPairDao.java @@ -27,6 +27,8 @@ public interface SSHKeyPairDao extends GenericDao { public SSHKeyPairVO findByName(long accountId, long domainId, String name); + public SSHKeyPairVO findByPublicKey(String publicKey); + public boolean deleteByName(long accountId, long domainId, String name); } diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java index d0b741df351..e32e14a3dab 100644 --- a/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java +++ b/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java @@ -57,7 +57,14 @@ public class SSHKeyPairDaoImpl extends GenericDaoBase implem sc.addAnd("name", SearchCriteria.Op.EQ, name); return findOneBy(sc); } - + + @Override + public SSHKeyPairVO findByPublicKey(String publicKey) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("publicKey", SearchCriteria.Op.EQ, publicKey); + return findOneBy(sc); + } + @Override public boolean deleteByName(long accountId, long domainId, String name) { SSHKeyPairVO pair = findByName(accountId, domainId, name); diff --git a/server/src/com/cloud/vm/dao/UserVmData.java b/server/src/com/cloud/vm/dao/UserVmData.java index aa3c4401553..65bbb07f7e1 100644 --- a/server/src/com/cloud/vm/dao/UserVmData.java +++ b/server/src/com/cloud/vm/dao/UserVmData.java @@ -66,6 +66,7 @@ public class UserVmData { private Long publicIpId; private String publicIp; private String instanceName; + private String sshPublicKey; private boolean initialized; @@ -706,5 +707,13 @@ public class UserVmData { public void setInstanceName(String instanceName) { this.instanceName = instanceName; } + + public String getSshPublicKey() { + return sshPublicKey; + } + + public void setSshPublicKey(String sshPublicKey) { + this.sshPublicKey = sshPublicKey; + } } diff --git a/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java index 3781a603b6a..c1c7cddf9b0 100644 --- a/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java @@ -35,7 +35,7 @@ public class UserVmDetailsDaoImpl extends GenericDaoBase i VmSearch.done(); DetailSearch = createSearchBuilder(); - DetailSearch.and("hostId", DetailSearch.entity().getVmId(), SearchCriteria.Op.EQ); + DetailSearch.and("vmId", DetailSearch.entity().getVmId(), SearchCriteria.Op.EQ); DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ); DetailSearch.done(); }